2011-02-03 65 views
8

我正在嘗試調試客戶端向我們報告的錯誤。堆棧跟蹤只有字節偏移量,而不是行數。在.NET程序集中查找字節偏移量

例如

[NullReferenceException異常:對象引用不設置爲一個對象的一個​​實例]
Foo.Bar(FooFoo P)32
Foo.BarBar()191
Foo.BarBarBar()15

如何反向工程這些字節偏移到代碼/方法調用等行?

我如何才能找到其中的NullReferenceException被拋出?

+3

可能會更好應用程序調試符號,這將產生線,而不是在堆棧跟蹤偏移 – Andrey 2011-02-03 12:36:33

+1

如果您啓用優化編譯不太容易 – 2011-02-03 12:39:59

+0

+1,沒有理由調試symbolos不編譯即使不運行生活,這你可以將它們發送到客戶端 – TomTom 2011-02-03 12:40:24

回答

4

這是可能的工作(或者可以不:))的解決方案。的問題是,偏移量和行號之間的映射被包含在PDB(又名調試符號)

  1. 採取恰好(重要)相同構建配置爲用於船舶二進制到客戶端的一個。然後轉到項目屬性,選項卡「Build」,單擊頁面底部的「Advanced」按鈕。然後找到「Debug Info」並選擇「pdb-only」
  2. 構建項目並轉到輸出文件夾。
  3. 選擇ildasm,要麼將它添加到PATH或其他地方複製。
  4. 在您的生成文件夾中執行ildasm /LINENUM /SOURCE YourFile.exe。它將輸出具有偏移和源線映射的IL。

唯一的問題,我看到你不能生產剛好相同的二進制文件和映射可能會波動。

3

我記得把我的頭頂部的唯一工具將是.NET Reflector。打開與您客戶端的二進制文件完全相同的二進制文件,並將「選項」對話框中的語言更改爲IL,並且它應該顯示(AFAIK)與每行上的標籤相同的字節偏移量。

你必須閱讀IL,而不是C#或任何東西,雖然,但它總比沒有好。

3
  1. 在Visual Studio中打開項目上Foo.Bar(FooFoo P)
  2. 認沽斷點
  3. 編譯並開始調試。執行將調用Foo.Bar(FooFoo p)的操作。請注意,您需要使用用於生產,當然同樣的源代碼
  4. 打開調用堆棧窗口(因爲優化的)客戶端組件配置,右鍵單擊並啓用「顯示字節偏移」和禁用「顯示行號」
  5. 單步執行功能,直到你點擊「MyAssembly.dll!MyProject.Something.Foo」。酒吧(FooFoo P)+ 0x32字節」(或 「+ 0×20字節」,如果你的偏移十進制數)

編輯:Andreys的解決方案是在未來可運送壽:)

相關問題