Dll WinDBG不';尽管加载了专用pdb文件,但仍无法显示源行

Dll WinDBG不';尽管加载了专用pdb文件,但仍无法显示源行,dll,debugging,windbg,Dll,Debugging,Windbg,我正在尝试使用WinDBG调试本机DLL中的一个问题。我相信我已经加载了专用符号,但WinDBG没有显示源代码行或参数信息。这就是我所观察到的;任何帮助都将不胜感激 我有PDB,我相信它对应于符号搜索路径中的DLL。运行lm我看到: 01050000 01058000 3NMSMTHR C (private pdb symbols) e:\ads_symbols\3NMSMTHR.pdb 由于这是“专用pdb符号”,我希望这是专用pdb 我还运行了symchk并看到以下输出: C:\ut

我正在尝试使用WinDBG调试本机DLL中的一个问题。我相信我已经加载了专用符号,但WinDBG没有显示源代码行或参数信息。这就是我所观察到的;任何帮助都将不胜感激

我有PDB,我相信它对应于符号搜索路径中的DLL。运行lm我看到:

01050000 01058000   3NMSMTHR C (private pdb symbols)  e:\ads_symbols\3NMSMTHR.pdb
由于这是“专用pdb符号”,我希望这是专用pdb

我还运行了symchk并看到以下输出:

C:\utils\inetmgr\patch01>"c:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" /v 3nmsmthr.dll /s c:\utils\inetmgr\patch01
[SYMCHK] Searching for symbols to C:\utils\inetmgr\patch01\3nmsmthr.dll in path c:\utils\inetmgr\patch01
DBGHELP: Symbol Search Path: c:\utils\inetmgr\patch01
[SYMCHK] Using search path "c:\utils\inetmgr\patch01"
DBGHELP: No header for C:\utils\inetmgr\patch01\3NMSMTHR.DLL.  Searching for image on disk
DBGHELP: C:\utils\inetmgr\patch01\3NMSMTHR.DLL - OK
DBGHELP: 3NMSMTHR - private symbols & lines
     c:\utils\inetmgr\patch01\3NMSMTHR.pdb
[SYMCHK] MODULE64 Info ----------------------
[SYMCHK] Struct size: 1680 bytes
[SYMCHK] Base: 0x10000000
[SYMCHK] Image size: 32768 bytes
[SYMCHK] Date: 0x4cc1b0f8
[SYMCHK] Checksum: 0x00000000
[SYMCHK] NumSyms: 0
[SYMCHK] SymType: SymPDB
[SYMCHK] ModName: 3NMSMTHR
[SYMCHK] ImageName: C:\utils\inetmgr\patch01\3NMSMTHR.DLL
[SYMCHK] LoadedImage: C:\utils\inetmgr\patch01\3NMSMTHR.DLL
[SYMCHK] PDB: "c:\utils\inetmgr\patch01\3NMSMTHR.pdb"
[SYMCHK] CV: RSDS
[SYMCHK] CV DWORD: 0x53445352
[SYMCHK] CV Data:  I:\usr\bpi\adrutl\3NMSMTHR.pdb
[SYMCHK] PDB Sig:  0
[SYMCHK] PDB7 Sig: {A865C40A-5070-4752-AD1F-CD3087843807}
[SYMCHK] Age: 4
[SYMCHK] PDB Matched:  TRUE
[SYMCHK] DBG Matched:  TRUE
[SYMCHK] Line nubmers: TRUE
[SYMCHK] Global syms:  TRUE
[SYMCHK] Type Info:    TRUE
[SYMCHK] ------------------------------------
SymbolCheckVersion  0x00000002
Result              0x001f0001
DbgFilename
DbgTimeDateStamp    0x4cc1b0f8
DbgSizeOfImage      0x00008000
DbgChecksum         0x00000000
PdbFilename         c:\utils\inetmgr\patch01\3NMSMTHR.pdb
PdbSignature        {A865C40A-5070-4752-AD1F-CD3087843807}
PdbDbiAge           0x00000004
[SYMCHK] [ 0x00000000 - 0x001f0001 ] Checked "C:\utils\inetmgr\patch01\3NMSMTHR.DLL"

SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
这将在我给定的正确路径中找到PDB(请注意,我将这个PDB文件复制到了e:\ads\u symbols,这是在lm输出中看到的路径)。这个symchk输出声明行号:true,因此我希望看到私有样式信息。但是,如果我运行~kv,那么对于堆栈跟踪中的函数,我会看到:

00bef2ac 01052a8a 00000000 00000000 00020aa4 3NMSMTHR!BPMThrProcTerm+0x2c0
00bef2cc 100073eb 00bef4d8 00000000 00000000 3NMSMTHR!BPMThrThreadInitName+0x2a
这看起来不像是在读取私有信息——我没有像在MSFT符号服务器上有私有符号的MS CRT函数那样获得源代码列表。如果我做了x/t/d 3nmsthr!ThreadInitName然后我得到

01052a60 <NoType> 3NMSMTHR!BPMThrThreadInitName = <no type information>
这对我来说毫无意义。任何帮助都将不胜感激。我的总体目标是获取参数和源信息。或者确认我拥有的PDB文件实际上不是私有符号。我没有构建这个DLL或PDB,也不知道传递给它的链接器选项的任何细节

谢谢

编辑:

我没有提到我得到了校验和错误:

*** WARNING: Unable to verify checksum for C:\utils\inetmgr\3NMSMTHR.dll
对不起!我尝试运行.lines命令,如下所示,我看到:

*** WARNING: Unable to verify checksum for C:\utils\inetmgr\3NMSMTHR.dll
DBGHELP: 3NMSMTHR - private symbols & lines 
    e:\ads_symbols\3NMSMTHR.pdb
Line number information will not be loaded
所以我想这是我的问题。这引出了我的下一个问题:有没有办法修复校验和(列为0,请参见上面的symchk输出)?给定symchk输出,此PDB是正确的。我能让它绕过校验和检查吗

编辑2:

对于其他遇到此问题的人:我能够通过以下方式修复校验和警告:

editbin /release 3NMSMTHR.DLL
这将设置PE标头中的校验和。然后,我不得不运行

.symopt+0x40
在WinDbg中,以强制它加载PDB,即使DLL上的时间戳不同。我确信我也可以使用一些实用程序来更新修改后的时间戳

这修复了有关校验和的警告…但仍然没有参数信息(在右帧上运行dv),没有源行信息,等等

所以现在我迷路了。这些PDB是否可能不包含该信息?我怎么能证实呢?我将如何构建它们来容纳它?我们使用NMAKE来构建这些

编辑3:


我重建了DLL和PDB作为调试,然后得到了我期望的所有堆栈跟踪信息。所以现在我的问题是:(1)是否有可能在版本中构建并获取静态函数、参数信息等(私有符号信息)?(2)我在发布dlls+pdbs时得到的堆栈跟踪是不正确的——第一个函数入口点是正确的,但是下一个堆栈帧显示了一个未调用的func。我的假设是发行版DLL内联了一些函数,而PDB只是在“猜测”该框架中的函数?非常奇怪。

您是否尝试了.lines命令

如果函数是用汇编语言编写的,则不会有类型信息。也可能是静态库链接到DLL,而静态库没有完整的调试信息。

如果您希望即使在发布模式下也能理解转储或堆栈跟踪,则应确保:

  • 使用/Zi或/Zi进行编译(调试信息格式是两个程序数据库选项之一)
  • 不使用/Oy编译(省略帧指针)
  • 您可以链接到/DEBUG(生成调试信息)
  • 您保留(但不分发)生成的.pdb文件

  • 最主要的是避免忽略帧指针;省略它们可以在函数调用中节省一点时间/空间,但会使堆栈遍历变得非常困难。请注意,由于其他优化设置(特别是内联),您可能仍然会从发布版本中获得奇怪的堆栈跟踪,但它们应该仍然具有大多数有趣的功能。

    我知道这是一个老问题,但对于遇到此问题的任何人来说,对我有效的方法是运行“.lines-e”。这可能是纳文的建议。

    谢谢您的反馈!见我的编辑上面。我愚蠢地忘了提到校验和错误。谢谢你的反馈!至少现在我看到windbg因为校验和问题选择不加载行信息。你知道怎么绕过它吗?
    .symopt+0x40