2017-03-02 76 views
0

我有下一个工作流程:为什么我得到错误的调试符号?

1)生成dll和pdb文件。

2)共享DLL来CUTOMER

3)从客户Analize存储器转储。

当我运行在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

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 

我有与此相关的转储日志中获取的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

这些信息太少,太模糊。你能发布一些具体的输出吗? ChkMatch的确切输出是什么,WinDbg中的确切警告文字是什么。什么是符号路径?这两种工具是否真的使用相同的文件?在WinDbg中输出'lm','.symopt'和'.sympath'的输出。通常WinDbg根本不加载不匹配的符号。如果是这样,你已经“调整”了一些东西 –

+0

好吧,但现在看起来像不同的问题 –

+0

你添加到问题中的内容证实了我的想法。我现在可以更自信地回答你的问题。+1用于跟踪并提供必要信息 –

回答

1

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

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

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

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

你应该包括微软的符号,以及,在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和其他操作系统的方法从而摆脱“错误的符号”的信息。