8

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

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

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

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

因此,我使用嗅探器对其进行了检查,有趣的是,在作为服务运行时,没有向微软符号服务器发出请求。

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

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

有人知道这个问题的解决方法吗?

4

3 回答 3

12

完整答案在这里:https ://web.archive.org/web/20150221111112/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.

于 2011-05-12T07:10:45.197 回答
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
于 2018-05-31T07:40:38.657 回答
2

您也可以做相反的事情 - 通过添加强制 dbghelp.dll 使用 WinInet 而不是 WinHTTP

DBGHELP_WININET=1

到系统环境。它将修复 cdb.exe 和其他使用 dbghelp.dll 的工具(例如 symchk.exe)中的问题。

于 2017-09-29T14:36:29.810 回答