在 Windows 服务中运行 cdb 时无法下载 microsoft 符号
我有一个 .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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
完整答案在这里:
从命令提示符运行时,cdb 使用 WinINet 访问 Internet 资源。从 Windows 服务运行时,cdb 使用 WinHTTP 访问 Internet 资源。
对于 WinHTTP,您需要设置一些注册表设置以阻止尝试使用代理 (bogusproxy) 访问符号服务器。
您可以强制 cdb 从命令行使用 WinHttp,从而通过在加载 cdb 之前键入以下内容来模拟服务中发生的情况以进行测试。
要禁用 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.
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.
来强制 dbghelp.dll 使用 WinInet 而不是 WinHTTP
您还可以执行相反的操作 - 通过添加到系统环境 。它将修复 cdb.exe 和其他使用 dbghelp.dll(例如 symchk.exe)的工具中的问题。
You can also do the opposite - force dbghelp.dll to use WinInet instead of WinHTTP by adding
to the system environment. It will fix the issue in cdb.exe and other tools that use dbghelp.dll, symchk.exe for example.
从任务计划程序运行时也会出现同样的问题。
我尝试过使用不同的帐户,但无济于事,直到我找到这篇文章。
我正在从 python 脚本启动 CDB(该脚本执行所有“魔法”以获取正确的先决条件),并且为了简化 python 的启动,我创建了一个小批处理脚本。
按照 sekogan 的描述添加环境变量解决了该问题。
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.