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

时间:2011-02-23 18:29:25

标签: windows-services windbg symbols wininet winhttp

我有一个.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的方法。

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

3 个答案:

答案 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而不是WinHTTP
DBGHELP_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