Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot download microsoft symbols when running cdb in a windows service

I have a .NET windows service that is calling cdb.exe to analyze crash dumps. I want to download the symbols from http://msdl.microsoft.com automatically when needed, using the argument:

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

If I run the application as a console application, It works as expected and it downloads the needed symbols for each dump.

The problem is when I start the app as a windows service, the symbols are not downloaded and, if I turn symnoisy on, at cdb's output log I have an entry for each symbol saying that the symbol hasn't been found at http://msdl.microsoft.com

So, I've checked it using a sniffer and the funny thing is that no request is made to the microsoft symbols server when running as a service.

Googling a little, I've found that I'm not the only one with this issue and it seems that the problem is that when running an application as a windows service, it is using winHTTP library for http requests, instead of wininet, which I think is the root of the problem: http://support.microsoft.com/kb/238425

So, I don't know why, cdb is not able to connect to ms symbols server using winHTTP library and I need a way to force cdb use wininet by default.

Anyone has an idea of a workaround to this issue?

like image 836
David Espart Avatar asked Feb 23 '11 18:02

David Espart


2 Answers

Full answer here: https://web.archive.org/web/20150221111112/http://infopurge.tumblr.com/post/10438913681/how-does-cdb-access-the-microsoft-symbol-server

When running from a Command Prompt, cdb uses WinINet to access internet resources. When running from a Windows service, cdb uses WinHTTP to access internet resources.

For WinHTTP you need to set some registry settings to stop an attempt to use a proxy (bogusproxy) for accessing the symbol server.

You can force cdb to use WinHttp from a command line, and thus emulate what is happening within the service for test purposes by typing the following before loading cdb.

SET DBGHELP_WINHTTP=AnythingOtherThanEmpty

To disable the WinHTTP proxy for cdb and symsrv you need to set the one of the following keys in the registry.

For x32 version of cdb running on a x32 bit machine from the Windows Service environment. HKLM\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

For x32 version of cdb running on a x32 bit machine from a Command Prompt. HKEY_CURRENT_USER\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

For x32 version of cdb running on a x64 bit machine from the Windows Service environment. HKLM\Software\Wow6432Node\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

For x32 version of cdb running on a x64 bit machine from a Command Prompt. HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

For x64 version of cdb running on a x64 bit machine from the Windows Service environment. HKLM\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

For x64 version of cdb running on a x64 bit machine from a Command Prompt. HKEY_CURRENT_USER\Software\Microsoft\Symbol Server\NoInternetProxy DWORD 1.

like image 67
Mark D Jackson Avatar answered Sep 27 '22 17:09

Mark D Jackson


You can also do the opposite - force dbghelp.dll to use WinInet instead of WinHTTP by adding

DBGHELP_WININET=1

to the system environment. It will fix the issue in cdb.exe and other tools that use dbghelp.dll, symchk.exe for example.

like image 38
sekogan Avatar answered Sep 27 '22 17:09

sekogan