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

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


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

问题是当我以Windows服务启动应用程序时,没有下载符号,并且如果我打开symnoisyy,则在cdb的输出日志中,每个符号都有一个条目,表示在http://msdl.microsoft.com上找不到该符号。

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

Googling一点,我发现我不是唯一遇到此问题的人,而且似乎问题在于,将应用程序作为Windows服务运行时,它使用的是HTTP请求的winHTTP库,而不是wininet ,我认为这是问题的根源:http://support.microsoft.com/kb/238425

因此,我不知道为什么,cdb无法使用winHTTP库连接到ms符号服务器,并且我需要一种默认情况下强制cdb使用wininet的方法。

任何人都有解决此问题的方法吗?

最佳答案

完整答案在这里: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


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

对于Windows服务环境中在x32位计算机上运行的x32版本的cdb。
HKLM \软件\ Microsoft \符号服务器\ NoInternetProxy DWORD 1。

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

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

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

对于从Windows Service环境在x64位计算机上运行的cdb的x64版本。
HKLM \软件\ Microsoft \符号服务器\ NoInternetProxy DWORD 1。

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

08-24 15:20