[英]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是內存訪問沖突(試圖訪問它不擁有的內存)。 我特別想知道更多有關以下內容的信息:
請注意,我主要是一名C ++程序員,所以雖然我對匯編有所了解,但我對它的了解非常有限。 此外,這確實不是一個需要修復的嚴重問題(並且鑒於程序的性質也不容易復制),我只是以此為借口來了解這些錯誤消息的含義。 我在網上找到的關於這些崩潰日志的大部分信息通常都是針對最終用戶的,所以他們並沒有幫助我(作為程序員)。
提前致謝
64位時間戳是自1601年1月1日(UTC)以100納秒間隔創建時間應用程序的主線程(這稱為FILETIME
)。 32位時間戳確實是time_t
格式(它告訴模塊創建的時間並存儲在模塊的標題中)。
我會說0x0002d160是模塊加載地址的偏移量(絕對地址似乎太低了)。 啟動Visual Studio,啟動調試器,查看“模塊”調試窗口。 你的exe文件應該列在那里。 找到加載模塊的地址,將0x0002d160添加到該地址,然后查看結果地址處的反匯編。 Visual Studio顯示與程序集混合的源代碼,您應該沒有問題找出導致問題的源代碼行。
調試上帝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.