2012-02-14 90 views
0

地圖文件看起來像:如何診斷此次崩潰?

0002:000442e4 00000118H .idata$2    DATA 
0002:000443fc 00000014H .idata$3    DATA 
0002:00044410 00000b7cH .idata$4    DATA 
0002:00044f8c 0000512eH .idata$6    DATA 
0002:0004a0ba 00000000H .edata     DATA 

的崩潰信息是這樣的:

Application Error : The instruction at "0x00458ae1" referenced memory at "0x00000074". The memory could not be "read". 

我試圖讓下一個崩潰堆棧轉儲,但在我看來,這是一個我們打破了堆棧,然後做了一個回報,這使我們最終執行數據。

我不能完全肯定,但因爲我看過一些這樣的文章:Under the Hood Article似乎表明這是進口的方法名

,一個導入庫提供了導入API的數據的區域保持 其名稱全部以.idata開頭(例如, .idata $ 4,.idata $ 5和.idata $ 6)。 .idata $ 5部分包含一個 單個DWORD,當可執行程序加載時,它包含導入的函數的地址 。 .idata $ 6部分(如果存在)包含導入函數的名稱 。將可執行文件加載到 內存時,Win32加載程序使用此字符串有效地調用導入的函數上的GetProcAddress。

沒有堆棧回溯我有點卡住了。我看着這次崩潰是錯誤的嗎?

回答

2

忘記MAP文件,更好地使用PDB文件。對於這個啓用鏈接選項/DEBUG - 是的,即使是發佈版本。/DEBUG是鏈接器選項,_DEBUG是編譯器選項。只有_DEBUG控制代碼,以及源代碼/頭文件對此的任何條件編譯。

調試版本禁用了優化,啓用了_DEBUG宏。 發佈版本已啓用優化,禁用_DEBUG宏。 /DEBUG只會將調試信息放入EXE/DLL中,並且不會影響其他任何內容。

回到問題,發生崩潰時。當WER(Windows錯誤報告)說它崩潰時,不要關閉該應用程序。將它保留在那裏,轉到任務管理器,轉到處理選項卡,選擇該崩潰/崩潰進程,並點擊「創建轉儲文件」。轉儲文件(full-dump)將在某個本地文件夾中創建(路徑將由任務管理器顯示)。您現在可以關閉崩潰的應用程序(WER窗口)。

現在將此.DMP文件複製到一些安全位置,最好是具有原始「發行」文件夾的文件夾。在Visual Studio或WinDbg中打開它。在VS上,按F11/F10,你會看到調用堆棧。如果多個線程正在運行(在崩潰的應用程序中),請啓動「線程」視圖,並查看唯一掛起的線程,雙擊它並找到崩潰位置。

您必須擁有正確的PDB以及所有的二進制文件,以及完全相同的代碼以查看代碼,否則調用堆棧將不會很好。

想要了解更多關於PDB和東西的信息,你可以閱讀this article