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

Dav*_*art 7 windows-services symbols windbg wininet winhttp

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

-y srv*c:\symbols*http://msdl.microsoft.com/download/symbols
Run Code Online (Sandbox Code Playgroud)

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

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

所以,我使用嗅探器检查了它,有趣的是,当作为服务运行时,没有请求微软符号服务器.

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

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

任何人都知道这个问题的解决方法?

Mar*_*son 11

完整答案:http://infopurge.tumblr.com/post/10438913681/how-does-cdb-access-the-microsoft-symbol-server

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

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

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

SET DBGHELP_WINHTTP=AnythingOtherThanEmpty
Run Code Online (Sandbox Code Playgroud)

要为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.