在 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
当 XAMPP 作为服务运行时,页面无法连接 ODBC 服务器(在 Windows Server 2008 上)