2008-12-18 36 views
3

我有我想要在調試一個崩潰的應用程序。然而,就很難發現問題的幾個原因:如何診斷應用程序退出訪問衝突

  • 墜機發生在關機,這意味着有問題的代碼不在堆棧
  • 崩潰只發生在發佈版本上,這意味着符號不可

死機的,我指的是以下情況例外:

0xC0000005: Access violation reading location 0x00000000. 

你會用什麼策略來診斷這個問題?

我迄今所做的是,直到我得到了最低限度,將導致崩潰從我的程序刪除儘可能多的代碼。它似乎在靜態鏈接到項目的代碼中發生,所以這也沒有幫助。

回答

5

甚至可以爲發佈版本創建符號文件。這樣做,運行你的程序,附加調試器,關閉它,並在調試器中查看崩潰的原因。

+0

該選項在visual C++ 6的鏈接選項卡中被稱爲「生成調試信息」。 – FryGuy 2008-12-19 00:57:01

1

你似乎有東西讀空指針 - 從來沒有好。

我不確定你在哪個平臺上。在Linux下,你可以考慮使用valgrind

什麼是你的版本不同,從建立你的調試,從調試信息是否存在建立分開?

你能建立一個帶有調試信息的靜態鏈接代碼嗎?你能獲得靜態鏈接代碼的調試版嗎?

+0

它是使用WTL的窗口。靜態鏈接的代碼是我們的,是的,我可以創建它的調試版本。 – FryGuy 2008-12-18 22:55:31

+0

當我點擊WTL標籤時,我發現一切與Windows相關......你確定你不能從完整的調試版本中崩潰嗎? – 2008-12-18 23:12:15

1

我會使用的策略正是你所做的。儘可能多地刪除代碼,直到問題消失,然後再添加最後一位並調試它。

但是,它可能不是你的代碼有問題。有一點需要注意 - 我們在AIX上發現了這個問題,即使您運行的是Windows,它也可能類似。

我們有一個第三方庫,動態加載另一個共享庫,在其初始化程序,設立的atexit函數被調用進程退出的時候。

然而,隨着我們的應用程序加載和卸載這些共享庫,由過程結束的時間,共享庫的atexit對功能在內存不再和我們轉儲核心。

這是從main()返回之後顯示爲訪問衝突所以如果這是發生在您身上的事情,那幾乎可以肯定是同樣的事情。 C RTL啓動代碼將遍歷atexit列表並調用它的每個函數,而不管你用它們做了什麼。

當然,如果它在main()退出之前崩潰,那麼這是一個有爭議的問題。

有一兩件事你可以考慮(和我們跟蹤下來,固定一個特別棘手的bug的成本/效益分析後實際上已經做到了這一點,有一次):送出去的調試版本爲您的產品。如果它沒有崩潰,這可能是一個快速解決方案,讓您的產品在您的閒暇時間得到更可接受的解決方案。