2011-03-11 147 views
21

我發現的每一篇文檔(參考文獻1至5)都會談到使用共享UNC路徑設置符號服務器,然後提供正確的設置到本地調試器實例(無論是_NT_SYMBOL_PATH還是Visual Studio IDE調試設置)。通過http設置公共(或私人)符號服務器

Microsoft通過http爲其公共符號存儲提供符號服務器(參考6)。

我想爲我自己的代碼創建一個可通過http傳輸訪問的符號服務器,而不是通過UNC文件共享。 Mozilla的人似乎已經這樣做了(參考文獻7),但它不再起作用。

到目前爲止,是否有更好的參考資料可用於執行此任務?


參考

  1. https://msdn.microsoft.com/en-us/library/b8ttk8zy(v=vs.80).aspx
  2. http://msdn.microsoft.com/en-us/library/ms680693(v=vs.85).aspx
  3. http://stackhash.com/blog/post/Setting-up-a-Symbol-Server.aspx
  4. http://entland.homelinux.com/blog/2006/07/06/ ...
  5. http://msdn.microsoft.com/en-us/windows/hardware/gg462988
  6. http://support.microsoft.com/kb/311503
  7. http://developer.mozilla.org/en/Using_the_Mozilla_symbol_server
+0

參考:1. http://msdn.microsoft.com/en-us/library/b8ttk8zy.aspx 2. http://msdn.microsoft.com/en-us/library/ms680693(v = vs.85)。aspx 3. http://www.stackhash.com/blog/post/Setting-up-a-Symbol-Server.aspx 4. http://entland.homelinux.com/blog/2006/07/06/設置符號服務器/ 5. http://msdn.microsoft.com/en-us/windows/hardware/gg462988 6. http://support.microsoft.com/kb/311503 7 。https://developer.mozilla.org/en/Using_the_Mozilla_symbol_server – 2011-03-11 22:21:03

+1

如果你在使用IIS的啓用WebDav的文件共享上設置它,該怎麼辦?也許這就是MS所做的。 – 2011-03-23 00:08:16

+0

所以也許要做的事情就是連接一個TCP連接監視器,然後只看流量去http://dl.microsoft.com看看它是怎麼做的。來自寶石城的 – 2011-03-23 12:20:07

回答

13

我相信答案是非常簡單的,「只是通過某種HTTP路徑的共享的目錄。」根據Chad Austin's entry on "Creating Your Very Own Symbol Server",這只是工作。

換句話說,symstore.exe用於存儲符號的目錄在提供爲http://symbols.example.com/public_symbols/時,將可用作Windows調試工具的符號服務器目標。

+1

+1。 – trashgod 2011-06-05 14:55:24

+2

乍得奧斯汀的文章沒有提到如何通過HTTP公開符號服務器。 – Crashworks 2014-03-16 23:43:26

11

多個用戶直接針對同一個符號存儲區使用Symstore.exe時要小心。微軟關於這個主題的白皮書聽起來就像是簡單地創建一個共享,讓每個人都通過作爲Windows調試工具一部分提供的SYMSTORE.EXE程序進行更新。白皮書建議您在每次構建時都完成此操作。

它對於單個用戶或通過單個正在更新團隊的符號服務器的人員彙集所有更新時效果很好。

不幸的是,一些白皮書底部的「細紋」表示,只有一個運行symstore.exe的用戶可以同時更新共享符號服務器而不會中斷內容。

(例如:在http://msdn.microsoft.com/en-us/library/ms681417(VS.85).aspx,Microsoft表示:「注意:SymStore不支持來自多個用戶的同時事務。建議將一個用戶指定爲符號存儲的」管理員「並負責所有添加和刪除事務。 「)

因此沒有固有的機制來將更新序列化到符號存儲。似乎多次同時嘗試更新符號存儲可能會破壞符號存儲和/或其索引。

我們不能爲我們的整個數千人,國際公司在所有時區依靠協調,通過一個人在一個位置建立。

基於這些白皮書,我在2009年3月向微軟提出了這個問題;誰證實這是一個可能的問題。在討論之後,我們選擇實現一個符號更新服務,該服務通過直接的Windows調試工具SDK DbgEng.DLL SymbolSrvStoreFile()API調用序列化更新,因此永遠不可能同時對同一個符號區域同時進行兩次更新。用戶有一個構建操作,通過服務對其符號進行排隊,而不是直接更新符號存儲。該服務然後序列化更新以確保永遠不會發生真正的併發更新嘗試。

有關使用SymSrvStoreFile的有限文檔當時並不十分清楚。我確實讓它工作。希望從那時起它有所改進。如果不是,最關鍵的問題是輸入路徑必須以類似於_NT_SYMBOL_PATH的格式指定。因此,例如,使用「C:\ Data \ MyProject \ bin」作爲輸入路徑,而不是指定「srv * C:\ Data \ MyProject \ bin」。

我們的服務現在還通過數據庫記錄更新。該數據庫既作爲符號存儲的備份(以防其損壞並且必須重建),還創建了一個報告點,以便經理和支持人員知道誰實際上保存了符號,誰不是。我們每週都會生成一個「符號檢查」報告,該報告會自動發送給利益相關方。

5

我們的(Mozilla's)符號服務器工作正常,AFAICT。我們沒有做任何特別複雜的事情,我們只是把PDB文件放到正確的目錄結構中(我們有a script for that,但是你可以使用symstore.exe)並通過Apache提供它。我認爲我們唯一特別的是有一些重寫規則允許以非區分大小寫的方式訪問文件,因爲微軟的工具在文件名/ GUID情況下確實不一致。

+0

新的鏈接是https://dxr.mozilla.org/mozilla-central/source/toolkit/crashreporter/tools/symbolstore.py – PhilLab 2017-11-11 14:43:20

4

通過HTTP提供的符號服務器與通過UNC文件路徑提供的符號服務器具有相同的結構,因此最簡單的方法是使用symstore.exe將文件存儲在某個文件夾中,然後使用簡單的HTTP服務器,通過HTTP公開該文件夾(即使在符號目錄中運行python -m SimpleHTTPServer也可以)。

一個小問題是,如果符號文件不存在,那麼HTTP服務器必須返回404錯誤代碼(至少在Visual Studio 2013下進行測試)。我遇到了HTTP服務器返回缺少文件403的問題,導致Visual Studio在第一個失敗請求後停止發出請求。

symstore.exe創建一些輔助文件和文件夾(000Admin/文件夾,refs.ptrfiles.ptr文件)。這些符號服務器都不需要這些工作。

如果你不想使用symstore.exe創建一個符號商店,你可以上傳文件與此結構:

BinaryName.pdb/$BUILD_ID/BinaryName.pdb BinaryName.exe/$LINK_ID/BinaryName.exe

哪裏BUILD_ID是嵌入在PDB文件和可執行文件,LINK_ID一個GUID是可執行文件中構建時間戳和文件大小的組合。這些可以通過從breakpad庫中讀取dump_syms.exe工具的輸出來獲得。請參閱http://www.chromium.org/developers/decoding-crash-dumps