SQL Server 不从符号服务器下载符号,即使 SymInitialize 在其路径中有 symserver

逆向工程 mssql 调试符号
2021-07-10 04:00:25

编辑澄清,我的意思是Jonathan Kehayias描述的扩展 exent ringbugger 堆栈跟踪

我最近发现可以获取 link.exe、dumpbin.exe 等以从符号服务器下载符号SQL Server 能够通过扩展事件捕获自己的调用跟踪。Traceflag 3656 允许您使用符号文件解码这些堆栈跟踪。 根据Paul Randal 的博客,您实际上需要将符号文件放在 sql server binn 文件夹中,并且它不会使用符号服务器。我决定调查一下,看看这是否属实。使用RohitABs API Monitor,我能够看到对 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() )

所以它看起来像 my _NT_SYMBOL_PATH,符号服务器被添加到SymInitialize()的搜索路径中如果是这种情况,为什么不从符号服务器下载符号?

1个回答

我对你的问题标题有点困惑

SQL Server 或除 WinDbg 之外的任何其他应用程序或特殊符号检索器将无法从 ms 符号服务器下载符号

你的意思是你所用symchksqlserver.exe为你链接的博客中提到的

获取任何应用程序符号的一种简单方法是

  1. 设置_NT_SYMBOL_PATH

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

  2. 使用有效的 Internet 连接在 WinDbg 中打开可执行文件

    windbg SqlServer.exe

    一旦 WinDbg 打开了应用程序

  3. 问题.reload /f,WinDbg 将获取所有符号文件并将它们缓存在下游存储中(F:\Symbols在上述场景中)

一旦相关.pdb文件在缓存中可用,symsrv.dll将使用缓存的符号文件并且不会寻找活动的 Internet 连接

避免将任何.pdb文件复制到任何本地文件夹

只需_NT_SYMBOL_PATH用于您所有的符号需求