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.
| 归档时间: |
|
| 查看次数: |
1142 次 |
| 最近记录: |