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

Posted

技术标签:

【中文标题】在 Windows 服务中运行 cdb 时无法下载 microsoft 符号【英文标题】:Cannot download microsoft symbols when running cdb in a windows service 【发布时间】:2011-07-02 23:49:41 【问题描述】:

我有一个 .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

所以,我使用嗅探器对其进行了检查,有趣的是,在作为服务运行时,没有向 microsoft 符号服务器发出任何请求。

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

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

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

【问题讨论】:

您的服务在什么帐户上下文中运行?作为 SYSTEM,您对网络资源的访问权限将受到限制。从 Windows 2000 开始,有一个用于网络相关服务的特殊帐户,不过……这可能已经是一个解决方案了。 这是我发现这个问题时的第一个想法。我试图以管理员和系统的身份运行它,但它不起作用。此外,该服务还执行一些能够连接到 Internet 资源的其他任务。 【参考方案1】:

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

【讨论】:

非常感谢您的回答。这个问题对我来说仍然没有解决。我会尽快尝试。 没问题。也请查看 www.StackHash.com。它可能会提供您尝试现成的功能。 stackhash.com 重定向到 fwdservice.com,而 fwdservice.com 又不返回任何内容。它仍然合法吗? 哇!而且我认为我会是唯一一个想将 cdb.exe 作为后台服务运行的疯子 :) 谢谢!问题解决了! 现在是 2018 年,解决方案仍然适用于 cdb 10.0.16299.15。页面顶部的链接不再可用(仅通过 webarchive),但实际上没有必要应用修复。感谢您的回答!【参考方案2】:

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

DBGHELP_WININET=1

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

【讨论】:

【参考方案3】:

从任务计划程序运行时会出现同样的问题。 在找到这篇文章之前,我尝试使用不同的帐户,但无济于事。

我正在从一个 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

【讨论】:

以上是关于在 Windows 服务中运行 cdb 时无法下载 microsoft 符号的主要内容,如果未能解决你的问题,请参考以下文章

无法让 Qt Creator 调试在 Windows 10 上运行

Qt 无法调试问题 ----- The cdb process terminated

Qt在Windows上的调试器安装与配置

当 XAMPP 作为服务运行时,页面无法连接 ODBC 服务器(在 Windows Server 2008 上)

不能访问windows installer服务,可能是你在安全模式下运行windows或者windows ins

服务器重新启动后,Windows 任务计划程序无法运行