0

我有下一个工作流程:

1)构建dll和pdb文件。

2)分享dll给客户

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

在这种情况下我怎么可能得到错误的调试符号?

4

1 回答 1

1

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

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

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

0:000> .sympath
D:\Work\path_to_dll

您还应该包括 Microsoft 符号,如如何在 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和其他方法,从而摆脱“错误符号”消息。

于 2017-03-02T16:06:19.400 回答