为什么我的调试符号错了?

时间:2017-03-02 11:33:02

标签: dll windbg pdb-files memory-dump

我有下一个工作流程:

1)构建dll和pdb文件。

2)分享dll到cutomer

3)从客户处分析内存转储。

当我在!analyze -v中运行WinDbg时,我得到了(输出的一部分以下)

....
MANAGED_STACK_COMMAND:  _EFN_StackTrace
PRIMARY_PROBLEM_CLASS:  WRONG_SYMBOLS
BUGCHECK_STR:  APPLICATION_FAULT_WRONG_SYMBOLS
// some callstack here
MODULE_NAME: RTPLogic
IMAGE_NAME:  RTPLogic.dll
DEBUG_FLR_IMAGE_TIMESTAMP:  58a43706
STACK_COMMAND:  ~541s; .ecxr ; kb
FAILURE_BUCKET_ID:  WRONG_SYMBOLS_c0000374_RTPLogic.dll!CSRTPStack::Finalize
BUCKET_ID:     X64_APPLICATION_FAULT_WRONG_SYMBOLS_rtplogic!CSRTPStack::Finalize+1da

看起来RTPLogic.dll的调试符号错误。 我下载了ChkMatch工具。 我从windbg

获取pdb路径
0:541> !lmi RTPlogic.dll
Loaded Module Info: [rtplogic.dll] 
         Module: RTPLogic
.....
            Age: 1, Pdb: D:\Work\path_to_original_pdb\RTPLogic.pdb
     Image Type: MEMORY   - Image read successfully from loaded memory.
    Symbol Type: PDB      - Symbols loaded successfully from image header.
                 C:\ProgramData\dbg\sym\RTPLogic.pdb\9F82CDF359044635ADEBA578CA1D1D031\RTPLogic.pdb
       Compiler: Resource - front end [0.0 bld 0] - back end [9.0 bld 21022]
    Load Report: private symbols & lines, not source indexed 
                 C:\ProgramData\dbg\sym\RTPLogic.pdb\9F82CDF359044635ADEBA578CA1D1D031\RTPLogic.pdb

我有与此转储相关的日志,我看到我的更改显示在日志中。所以客户在获取memdump之前不会忘记安装我的DLL。 我运行ChkMatch

PS D:\tools> .\ChkMatch.exe -c "D:\Work\path_to_dll\RTPLogic.dll" "C:\Progra
mData\dbg\sym\RTPLogic.pdb\9F82CDF359044635ADEBA578CA1D1D031\RTPLogic.pdb"
.....
Result: Matched

在这种情况下我怎么可能出错了调试符号?

1 个答案:

答案 0 :(得分:1)

RTPLogic.dll!CSRTPStack::Finalize的符号是正确的,但重建调用堆栈所需的其他符号不正确。您可能在调用堆栈上有一些操作系统方法,并且缺少ntdll或类似的符号。

由于使用ChkMatch,您只检查一个单独的PDB文件,因此ChkMatch的结果与WinDbg(对于许多PDB)的结果一样可靠和正确(对于一个PDB)并且它们彼此不矛盾。

您的同情可能只包含您自己的DLL的本地路径,并且不包含有关Microsoft的符号服务器的任何信息。在.sympath的输出中(您没有发布),我希望看到类似

的内容
0:000> .sympath
D:\Work\path_to_dll

您还应该包含Microsoft符号,如How to set up symbols in WinDbg中所述。要解决此问题,请使用以下命令:

.symfix+ c:\symbols
.reload /f

.sympath的输出现在应该是

0:000> .sympath
D:\Work\path_to_dll;SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

这应该有助于WinDbg重建完整的调用堆栈,解析ntdll和其他人的操作系统方法,从而摆脱“错误的符号”消息。