我有一个.NET Windows服务,它正在调用 cdb.exe 来分析崩溃转储。我想在需要时使用以下参数自动从http://msdl.microsoft.com下载符号:
-y srv*c:\symbols*http://msdl.microsoft.com/download/symbols
如果我将应用程序作为控制台应用程序运行,它会按预期工作,并为每个转储下载所需的符号。
问题是,当我将应用程序作为Windows服务启动时,符号不会被下载,如果我打开symnoisy,在cdb的输出日志中我有一个条目,每个符号都表示没有找到符号http://msdl.microsoft.com
所以,我使用嗅探器检查了它,有趣的是,当作为服务运行时,没有请求微软符号服务器。
Googling一点,我发现我不是唯一有这个问题的人,而且似乎问题是在将应用程序作为Windows服务运行时,它正在使用winHTTP用于http请求的库,而不是wininet,我认为这是问题的根源:http://support.microsoft.com/kb/238425
所以,我不知道为什么,cdb无法使用winHTTP库连接到ms符号服务器,我需要一种强制cdb默认使用wininet的方法。
任何人都知道解决此问题的方法吗?
答案 0 :(得分:10)
在此完整答案: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 \ 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。
答案 1 :(得分:2)
你也可以这样做 - 强制dbghelp.dll通过添加
来使用WinInet而不是WinHTTPDBGHELP_WININET=1
到系统环境。它将修复cdb.exe和其他使用dbghelp.dll,symchk.exe的工具中的问题。
答案 2 :(得分:2)
从任务计划程序运行时出现同样的问题。 在我找到这篇文章之前,我尝试过使用不同的帐户,但无济于事。
我正在从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