【问题标题】:WinDBG doesn't display source lines despite loading private pdb files尽管加载了私有 pdb 文件,WinDBG 不显示源代码行
【发布时间】:2011-08-30 00:59:27
【问题描述】:

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

我有我认为对应于符号搜索路径中的 DLL 的 PDB。运行 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_symbols,这是在 lm 输出中看到的路径)。这个 symchk 输出状态 Line Numbers: true ,因此我希望看到私有样式信息。但是,如果我运行 ~kv,那么对于堆栈跟踪中的函数,我会看到:

00bef2ac 01052a8a 00000000 00000000 00020aa4 3NMSMTHR!BPMThrProcTerm+0x2c0
00bef2cc 100073eb 00bef4d8 00000000 00000000 3NMSMTHR!BPMThrThreadInitName+0x2a

这看起来不像是在读取私人信息——我没有像我为在 MSFT 符号服务器上具有私人符号的 MS CRT 函数那样获得源列表。另外,如果我执行 x /t /d 3NMSMTHR!ThreadInitName 那么我会得到

01052a60 <NoType> 3NMSMTHR!BPMThrThreadInitName = <no type information>

最后,如果我尝试使用 .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.

这对我来说没有意义。任何帮助将非常感激。我的总体目标是获取参数和源信息。或者确认我拥有的 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 是正确的。我可以让它绕过校验和检查吗?

EDIT2:

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

editbin /release 3NMSMTHR.DLL

这会在 PE 标头中设置校验和。然后我不得不运行

.symopt+0x40

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

修复了关于校验和的警告......但仍然没有参数信息(在右侧框架上运行 dv),没有源代码行信息等。

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

EDIT3:

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

【问题讨论】:

    标签: dll debugging windbg


    【解决方案1】:

    您是否尝试过 .lines 命令?

    【讨论】:

    • 感谢您的反馈!我至少现在看到 windbg 由于校验和问题而选择不加载行信息。知道如何绕过它吗?
    【解决方案2】:

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

    【讨论】:

    • 感谢您的反馈!请参阅我上面的编辑。我愚蠢地忘记提及校验和错误。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      我知道这已经过时了,但是对于遇到此问题的任何人来说,对我有用的是运行“.lines -e”。这可能是 Naveen 的建议。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多