4

EDIT Clarified, I meant the extended exent ringbugger stacktraces described by Jonathan Kehayias.

I recently discovered it was possible to get link.exe, dumpbin.exe, etc to download symbols from a symbol server. SQL Server has the ability to capture its own call traces through extended events. Traceflag 3656 lets you decode these stack traces with symbol files. As per Paul Randal's blog, you need to actually put the symbol files in the sql server binn folder, and it wouldn't use the symbol server. I decided to investigate to see how true this is. Using RohitABs API Monitor, I was able to see the following calls being made to DbgHelp.dll:

ImagehlpApiVersion (  )
SymSetOptions ( SYMOPT_DEFERRED_LOADS | SYMOPT_LOAD_LINES | SYMOPT_UNDNAME )
SymInitialize ( GetCurrentProcess(), "C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER2012\MSSQL\Binn\;C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER2012\MSSQL\BINN;symsrv*symsrv.dll*c:\symbols*http://msdl.microsoft.com/download/symbols;C:\Windows;C:\Windows\system32", TRUE )
SymRegisterCallback64 ( GetCurrentProcess(), 0x000007fec5a77810, 0 )
    /* The following SymGetSymFromAddr() calls happen because fInvadeProcess  was set to true  */
SymGetSymFromAddr ( GetCurrentProcess(), 3313710117, 0x000000001b06c060, 0x000000001b06b348 )
SymGetSymFromAddr ( GetCurrentProcess(), 3313710116, 0x000000001b06c060, 0x000000001b06b348 )
    . . . 
    . . . 
    . . . 
SymCleanup ( GetCurrentProcess() )

So it looks like my _NT_SYMBOL_PATH, with the symbol server is being added to the search path of SymInitialize(). If that is the case, why aren't symbols being downloaded from the symbol server?

4

I am a bit confused by the title of your question

SQL Server or for that matter any other application apart from WinDbg or special symbol retrievers wont be able to download symbols from ms symbol servers

Did you mean you used symchk on the sqlserver.exe as mentioned in the blog you linked

A simple method to get symbols for any application is to

  1. set _NT_SYMBOL_PATH:

    _NT_SYMBOL_PATH=SRV*F:\symbols*http://msdl.microsoft.com/download/symbols

  2. open the executable in WinDbg with an active Internet connection

    windbg SqlServer.exe

    once WinDbg has opened the application

  3. issue .reload /f and WinDbg will fetch all the symbol files and will cache them in the downstream store (F:\Symbols in the above scenario)

once the relevant .pdb files are available in cache symsrv.dll will use the cached symbol file and wont look for an active Internet connection

Refrain from copying any .pdb files to any local folders

Just use _NT_SYMBOL_PATH for all your symbol needs

| improve this answer | |
  • please use the formatting properly. Both your answers so far had horrible formatting issues in their original form. – 0xC0000022L May 5 '13 at 2:07
  • @Justin Iam Not that familiar with SqlServer i read the post and i saw him mentioning that SqlServer.pdb needs to be in same directory as the sqlserver.exe any exe that shows call stacks should be having an option to set symbol path for example procmon from sysinternals will show either a raw stack with no symbols or if you fill the symbol path option it will show the stack trace with symbol resolved i think sqlserver might also have such an option – blabb May 6 '13 at 19:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.