在 Windows 服务中运行 cdb 时无法下载 microsoft 符号

发布于 2024-10-18 21:43:49 字数 1036 浏览 7 评论 0原文

我有一个 .NET windows 服务,它正在调用 cdb.exe 来分析故障转储。我想在需要时自动从 http://msdl.microsoft.com 下载符号,使用参数:

-y srv*c:\symbols*http://msdl.microsoft.com/download/symbols

If我将应用程序作为控制台应用程序运行,它按预期工作,并下载每个转储所需的符号。

问题是当我将应用程序作为 Windows 服务启动时,符号不会被下载,如果我打开 symnoisy,在 cdb 的输出日志中,每个符号都有一个条目,表示在 http://msdl.microsoft.com

因此,我使用嗅探器检查了它,有趣的是没有请求作为服务运行时对 Microsoft 符号服务器进行创建。

谷歌搜索 一点,我发现我不是唯一一个遇到这个问题的人,问题似乎是当将应用程序作为 Windows 服务运行时,它使用 winHTTP 库来处理 http 请求,而不是 wininet,我认为这是问题的根源http://support. microsoft.com/kb/238425

所以,我不知道为什么,cdb 无法使用 winHTTP 库连接到 ms 符号服务器,我需要一种方法来强制 cdb 默认使用 wininet。

有人知道解决这个问题的方法吗?

I have a .NET windows service that is calling cdb.exe to analyze crash dumps. I want to download the symbols from http://msdl.microsoft.com automatically when needed, using the argument:

-y srv*c:\symbols*http://msdl.microsoft.com/download/symbols

If I run the application as a console application, It works as expected and it downloads the needed symbols for each dump.

The problem is when I start the app as a windows service, the symbols are not downloaded and, if I turn symnoisy on, at cdb's output log I have an entry for each symbol saying that the symbol hasn't been found at http://msdl.microsoft.com

So, I've checked it using a sniffer and the funny thing is that no request is made to the microsoft symbols server when running as a service.

Googling a little, I've found that I'm not the only one with this issue and it seems that the problem is that when running an application as a windows service, it is using winHTTP library for http requests, instead of wininet, which I think is the root of the problem: http://support.microsoft.com/kb/238425

So, I don't know why, cdb is not able to connect to ms symbols server using winHTTP library and I need a way to force cdb use wininet by default.

Anyone has an idea of a workaround to this issue?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

浅浅 2024-10-25 21:43:49

完整答案在这里:

从命令提示符运行时,cdb 使用 WinINet 访问 Internet 资源。从 Windows 服务运行时,cdb 使用 WinHTTP 访问 Internet 资源。

对于 WinHTTP,您需要设置一些注册表设置以阻止尝试使用代理 (bogusproxy) 访问符号服务器。

您可以强制 cdb 从命令行使用 WinHttp,从而通过在加载 cdb 之前键入以下内容来模拟服务中发生的情况以进行测试。

SET DBGHELP_WINHTTP=AnythingOtherThanEmpty

要禁用 cdb 和 symsrv 的 WinHTTP 代理,您需要在注册表中设置以下项之一。

对于在 Windows 服务环境的 x32 位计算机上运行的 x32 版本的 cdb。
HKLM\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

对于从命令提示符在 x32 位计算机上运行的 x32 版本的 cdb。
HKEY_CURRENT_USER\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

对于在 Windows 服务环境中的 x64 位计算机上运行的 x32 版本的 cdb。
HKLM\Software\Wow6432Node\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

对于从命令提示符在 x64 位计算机上运行的 x32 版本的 cdb。
HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

对于在 Windows 服务环境中的 x64 位计算机上运行的 x64 版本的 cdb。
HKLM\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

对于从命令提示符在 x64 位计算机上运行的 x64 版本的 cdb。
HKEY_CURRENT_USER\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1。

Full answer here: https://web.archive.org/web/20150221111112/http://infopurge.tumblr.com/post/10438913681/how-does-cdb-access-the-microsoft-symbol-server

When running from a Command Prompt, cdb uses WinINet to access internet resources. When running from a Windows service, cdb uses WinHTTP to access internet resources.

For WinHTTP you need to set some registry settings to stop an attempt to use a proxy (bogusproxy) for accessing the symbol server.

You can force cdb to use WinHttp from a command line, and thus emulate what is happening within the service for test purposes by typing the following before loading cdb.

SET DBGHELP_WINHTTP=AnythingOtherThanEmpty

To disable the WinHTTP proxy for cdb and symsrv you need to set the one of the following keys in the registry.

For x32 version of cdb running on a x32 bit machine from the Windows Service environment.
HKLM\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

For x32 version of cdb running on a x32 bit machine from a Command Prompt.
HKEY_CURRENT_USER\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

For x32 version of cdb running on a x64 bit machine from the Windows Service environment.
HKLM\Software\Wow6432Node\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

For x32 version of cdb running on a x64 bit machine from a Command Prompt.
HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

For x64 version of cdb running on a x64 bit machine from the Windows Service environment.
HKLM\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

For x64 version of cdb running on a x64 bit machine from a Command Prompt.
HKEY_CURRENT_USER\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

怀念你的温柔 2024-10-25 21:43:49

来强制 dbghelp.dll 使用 WinInet 而不是 WinHTTP

DBGHELP_WININET=1

您还可以执行相反的操作 - 通过添加到系统环境 。它将修复 cdb.exe 和其他使用 dbghelp.dll(例如 symchk.exe)的工具中的问题。

You can also do the opposite - force dbghelp.dll to use WinInet instead of WinHTTP by adding

DBGHELP_WININET=1

to the system environment. It will fix the issue in cdb.exe and other tools that use dbghelp.dll, symchk.exe for example.

新一帅帅 2024-10-25 21:43:49

从任务计划程序运行时也会出现同样的问题。
我尝试过使用不同的帐户,但无济于事,直到我找到这篇文章。

我正在从 python 脚本启动 CDB(该脚本执行所有“魔法”以获取正确的先决条件),并且为了简化 python 的启动,我创建了一个小批处理脚本。

按照 sekogan 的描述添加环境变量解决了该问题。

@echo off
setlocal
REM Forcing CDB to use WinInet instead of WinHTTP when running as a 
REM 'service' due to that WinHTTP uses some bogus proxy when not run from 
REM the console.
set DBGHELP_WININET=1

set PYTHONPATH=<your path>
call <path to venv>\Scripts\python.exe -m <script module> <params>

endlocal

The same issue arises when running from the Task Scheduler.
I've tried using different accounts, to no avail, until I found this post.

I'm launching CDB from a python script (that performs all the 'magic' in getting the right prerequisites in place) and to ease the launch of python I've created a small batch script.

Adding the environment variable as described by sekogan solved the issue.

@echo off
setlocal
REM Forcing CDB to use WinInet instead of WinHTTP when running as a 
REM 'service' due to that WinHTTP uses some bogus proxy when not run from 
REM the console.
set DBGHELP_WININET=1

set PYTHONPATH=<your path>
call <path to venv>\Scripts\python.exe -m <script module> <params>

endlocal
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文