我有下一个工作流程:
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
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
在这种情况下我怎么可能出错了调试符号?
答案 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
和其他人的操作系统方法,从而摆脱“错误的符号”消息。