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?
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With