尽管加载了私有pdb文件,WinDBG仍不显示源代码行

ste*_*ash 6 debugging dll windbg

我试图使用WinDBG调试本机DLL中的问题.我相信我加载了私有符号,但WinDBG没有显示源代码行或参数信息.这就是我所观察到的; 任何帮助将不胜感激!

我有PDB,我认为它对应于符号搜索路径中的DLL.跑lm我看到:

01050000 01058000   3NMSMTHR C (private pdb symbols)  e:\ads_symbols\3NMSMTHR.pdb
Run Code Online (Sandbox Code Playgroud)

由于这表示"私有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
Run Code Online (Sandbox Code Playgroud)

这会在我给出的正确路径中找到PDB(请注意,我将此精确的PDB文件复制到e:\ ads_symbols,这是在lm输出中看到的路径).此symchk输出表明行号:true,因此我希望看到私有样式信息.但是,如果我运行~kv然后我在堆栈跟踪中的函数,我看到:

00bef2ac 01052a8a 00000000 00000000 00020aa4 3NMSMTHR!BPMThrProcTerm+0x2c0
00bef2cc 100073eb 00bef4d8 00000000 00000000 3NMSMTHR!BPMThrThreadInitName+0x2a
Run Code Online (Sandbox Code Playgroud)

这似乎不是它读取私人信息 - 我没有像MS CRT函数那样获得源列表,MS CRT函数在MSFT符号服务器上有私有符号.如果我做x/t/d 3NMSMTHR!然后我得到ThreadInitName

01052a60 <NoType> 3NMSMTHR!BPMThrThreadInitName = <no type information>
Run Code Online (Sandbox Code Playgroud)

最后,如果我尝试使用.frame3(转到该帧)然后执行dv来显示本地,我会收到:

0:001> .frame
03 00bef2cc 100073eb 3NMSMTHR!BPMThrThreadInitName+0x2a
0:001> dv
Unable to enumerate locals, HRESULT 0x80004005
Private symbols (symbols.pri) are required for locals.
Type ".hh dbgerr005" for details.
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义.任何帮助将非常感激.我的总体目标是获取参数和源信息.或者确认我拥有的PDB文件实际上不是私有符号.我没有构建此DLL或PDB,也不知道有关传递给它的链接器选项的任何细节.

谢谢!

编辑:

我没有提到我收到校验和错误:

*** WARNING: Unable to verify checksum for C:\utils\inetmgr\3NMSMTHR.dll
Run Code Online (Sandbox Code Playgroud)

抱歉! 我试图按照下面的建议运行.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
Run Code Online (Sandbox Code Playgroud)

所以我猜这是我的问题.这导致了我的下一个问题:是否有办法修复校验和(列为0,见上面的symchk输出)?给定symchk输出时,此PDB是正确的.我可以绕过校验和检查吗?

EDIT2:

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

editbin /release 3NMSMTHR.DLL
Run Code Online (Sandbox Code Playgroud)

这在PE头中设置了校验和.然后我不得不跑了

.symopt+0x40
Run Code Online (Sandbox Code Playgroud)

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

这修复了关于校验和的警告...但是STILL没有参数信息(在右框架上运行dv),没有源行信息等.

所以现在我迷路了.这些PDB可能不包含该信息吗?我怎么能确认?我如何构建它们来包含它?我们使用NMAKE来构建这些.

EDIT3:

我重建了DLL和PDB作为DEBUG,然后获得了我期望的所有堆栈跟踪信息.所以现在我的问题是:(1)是否有可能在版本中构建并获取静态函数,参数信息等(私有符号信息)?(2)我在发布dll + pdbs时得到的堆栈跟踪不正确 - 第一个函数入口点是正确的,但是接下来的堆栈帧显示了一个未调用的函数.我的假设是发布DLL内联了一些函数,并且某种程度上PDB只是"猜测"该框架中的函数?很奇怪.

Nav*_*een 4

您尝试过 .lines 命令吗?