2014-06-30 49 views
2

那麼我真正的問題是:_NT_SYMBOL_PATH路徑搜索遞歸(具體由windbg)?_NT_SYMBOL_PATH格式/是否遞歸?

但是,如果是/沒有問題沒有那麼有趣,那麼_NT_SYMBOL_PATH的官方格式是什麼?

+0

來自文檔:'對於符號路徑中的每個目錄,調試器查找三個目錄。例如,如果符號路徑包含c:\ MyDir目錄,並且調試器正在查找DLL的符號信息,則調試器首先在c:\ MyDir \ symbols \ dll中查找,然後在c:\ MyDir \ dll中查找,最後在c:\ MyDir中。然後調試器爲符號路徑中的每個目錄重複此過程。最後,調試器在當前目錄中查找,然後在當前目錄中追加\ dll。(調試器追加\ dll,\ exe或\ sys,具體取決於它正在調試的二進制文件。)' – EdChum

+0

不知道我理解你的問題,路徑是按順序解析的,所以正確地解析它非常重要,通常是系統文件夾在開始時以共享/第三方文件夾結尾。 – EdChum

回答

2

不,搜索不是遞歸的。但是,訪問目錄下的某些特定路徑,這不是一個詳盡的遍歷。

探測到的實際路徑取決於條目的類型。有兩種類型的實體可以放入_NT_SYMBOL_PATH:常規目錄和符號存儲。符號存儲可以是網絡共享或webdav共享甚至本地目錄。

將符號加載選項設置爲verbose - 命令爲!sym noisy。這將顯示探測到的所有路徑,以及在找到多個符號副本的情況下的優先級。下面是一個本地目錄和一個本地符號存儲的例子。

0:000> .reload -f notepad.exe 
DBGHELP: e:\temp\notepad.pdb - file not found 
DBGHELP: e:\temp\exe\notepad.pdb - file not found 
DBGHELP: e:\temp\symbols\exe\notepad.pdb - file not found 
SYMSRV: e:\mysyms\notepad.pdb\35E6B7011856420C844065A1599A0D682\notepad.pdb not found 
SYMSRV: e:\mysyms\notepad.pdb\35E6B7011856420C844065A1599A0D682\notepad.pdb not found 
DBGHELP: c:\Windows\SysWOW64\notepad.pdb - file not found 
DBGHELP: notepad.pdb - file not found 
<...> 
DBGHELP: notepad - no symbols loaded 
4

有不同類型的符號路徑用於不同的目的。我還沒有完全明白,但這是我目前的理解:

平面格式(單層)可能是最容易存儲自己的私人符號。只需放入所有的PDB。

請注意,文檔(如EdChum提供的參考文獻,可能是WinDbg幫助文件)不正確,恕我直言,尤其是關於加載順序。如果有疑問可以找出真實的加載順序,最好做一個!sym noisy

在任何n層的情況下,符號路徑不是直接搜索。調試器將從DLL或EXE文件中派生出一種散列,然後查找它。要將文件添加到n層符號路徑,請使用WinDbg附帶的symstore.exe。

的2層符號路徑看起來像

C:\symbols\<filename>.pdb\<hash>\<filename>.pdb 

3層符號路徑是

C:\symbols\<fi>\<filename>.pdb\<hash>\<filename>.pdb 

其中fi是第一個文件名的字母。

的1層,2層和3層符號路徑類型是由特殊的空文件pingme.txtindex2.txtflat.txt000Admin文件夾設置。您可以使用convertstore.exe在層之間進行轉換。 Channel 9 Defrag tools #88 videoEpisode #89闡明瞭這些文件,但我沒有在一個地方找到完整的參考。

我在一個目錄中混合了不同類型的符號路徑時遇到了問題,因此您可能需要花點時間閱讀它,然後再將其解決。