windows-serviceswindbgsymbolswininetwinhttp

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?


Solution

  • 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.