2017-03-02 132 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和其他操作系統的方法從而擺脫「錯誤的符號」的信息。