簡體   English   中英

分析Windows中的崩潰:錯誤消息告訴我們什么?

[英]Analyzing a crash in Windows: what does the error message tell us?

我個人使用的一個小實用程序(用C ++編寫)昨天隨機崩潰(我已經使用它大約100多個小時,到目前為止沒有問題)雖然我通常不這樣做,但我感覺有點喜歡冒險,想嘗試更多地了解這個問題。 我決定進入事件查看器,看看Windows記錄的崩潰事件:

Faulting application StraightToM.exe, version 0.0.0.0, time stamp 0x4a873d19 
Faulting module name : StraightToM.exe, version 0.0.0.0, time stamp 0x4a873d19
Exception code : 0xc0000005
Fault offset : 0x0002d160,
Faulting process id: 0x17b4
Faulting application start time: time 0x01ca238d9e6b48b9.

我的問題是,這些東西意味着什么,我將如何使用它們來調試我的程序? 這是我目前所知的:異常代碼描述了錯誤,而0xc0000005是內存訪問沖突(試圖訪問它不擁有的內存)。 我特別想知道更多有關以下內容的信息:

  1. 故障偏移是什么意思? 這是表示文件中發生錯誤的位置,還是表示發生錯誤的程序集“line”? 知道了故障偏移,我如何使用像OllyDbg這樣的程序來查找導致錯誤的相應匯編代碼? 或者 - 甚至更好 - 是否可以(輕松)確定C ++源代碼中的哪一行代碼導致此錯誤?
  2. 很明顯,時間戳對應於崩潰時的32位UNIX時間,但64位應用程序的啟動時間意味着什么? 如果時間戳為32,為什么它是64位?

請注意,我主要是一名C ++程序員,所以雖然我對匯編有所了解,但我對它的了解非常有限。 此外,這確實不是一個需要修復的嚴重問題(並且鑒於程序的性質也不容易復制),我只是以此為借口來了解這些錯誤消息的含義。 我在網上找到的關於這些崩潰日志的大部分信息通常都是針對最終用戶的,所以他們並沒有幫助我(作為程序員)。

提前致謝

64位時間戳是自1601年1月1日(UTC)以100納秒間隔創建時間應用程序的主線程(這稱為FILETIME )。 32位時間戳確實是time_t格式(它告訴模塊創建的時間並存儲在模塊的標題中)。

我會說0x0002d160是模塊加載地址的偏移量(絕對地址似乎太低了)。 啟動Visual Studio,啟動調試器,查看“模塊”調試窗口。 你的exe文件應該列在那里。 找到加載模塊的地址,將0x0002d160添加到該地址,然后查看結果地址處的反匯編。 Visual Studio顯示與程序集混合的源代碼,您應該沒有問題找出導致問題的源代碼行。

您可以使用此信息進行事后調查。

有用的信息是異常代碼0xc0000005,在這種情況下只是意味着訪問沖突。 因此,您取消引用null或您沒有的其他內存。

我懷疑,故障偏移是你的DLL加載到內存的偏移量,所以理論上你可以將它添加到你的基地址並找到有問題的代碼,但我不確定。

調試它的最佳選擇是在下次發生這種情況時在調試器中捕獲它。 您可以使用圖像文件執行選項調試器中自動運行您的應用程序。 確保您已准備好符號(如果您當前正在使用RELEASE,請考慮構建DEBUG)。

調試上帝John Robbins構建了一個名為CrashFinder的小工具來幫助解決這樣的情況: https ://www.wintellect.com/crashfinder-2-8-yes-native-code-still-lives/

為您向公眾發布的每個版本保存PDB總是一個好主意(這聽起來像是一個私有使用的工具,但最好保留PDB符號以獲得最新版本)。

看起來這里仍然沒有好的答案,如果崩潰發生在開發環境之外會怎樣。 我認為off set是匯編代碼崩潰的地址。 但是你需要知道那個dll的匯編代碼的起點在哪里。 或者您可能不需要知道起始地址,因為您可以使用組裝工具打開dll,並通過將偏移量添加到起始地址來查找匯編代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM