【发布时间】:2017-07-22 02:44:30
【问题描述】:
我有下一个工作流程:
1) 构建 dll 和 pdb 文件。
2) 分享 dll 给客户
3) 分析来自客户的内存转储。
当我在 WinDbg 中运行 !analyze -v 时,我得到了(低于输出的一部分)
....
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
在这种情况下我怎么可能得到错误的调试符号?
【问题讨论】:
-
信息太少,太模糊。你能发布一些具体的输出吗? ChkMatch 的确切输出是什么,WinDbg 中的确切警告文本是什么。符号路径是什么?这两个工具真的使用相同的文件吗?将
lm、.symopt和.sympath的输出发布到WinDbg 中。通常 WinDbg 根本不会加载不匹配的符号。如果是这样,你已经“调整”了一些东西 -
好的,但现在看起来不同的问题
-
您在问题中添加的内容证实了我的想法。我现在可以更有信心地回答你的问题了。 +1 用于跟进并提供必要的信息
-
c0000374 = 堆损坏,激活 appverifier/pageheap 以检测真正的原因,损坏发生在您的终结器尝试释放内存之前。
-
是的,你是对的。我只是想了解我是否拥有所有调试符号来继续使用这些标志进行调查。我担心内存损坏是我看到“错误调试符号”的原因。
标签: dll windbg pdb-files memory-dump