2011-04-18 109 views
0

我有一個Windows應用程序,它偶爾崩潰,然後不重複。 當它的時候,我得到純粹的虛函數調用。我已經設置它來使用ADplus創建Windows轉儲,即使它崩潰,也不會有轉儲。Windows應用程序與純虛擬函數調用崩潰

我很確定這是構建錯誤,我正在使用VC2008 SP1構建,這是發佈版本。

對此有何見解?我怎樣才能調試這個,它是一個帶有.pdb文件和映射文件的發佈版本。

感謝 禮

回答

2

正如已經指出的那樣,這是非常不可能的,這是一個構建錯誤。我有一個相當複雜的項目,有一個類似的問題,並能夠通過使用_set_purecall_handler並提供我自己的處理程序來追蹤它。通過這種方式,我可以在調試器發生故障時看到調用堆棧。顯然,這裏的另一個選擇是在發生時創建小型轉儲。請記住,在程序遇到異常之前,您需要爲小型轉儲程序準備一切。

但是,這可能是由堆損壞引起的。但在這種情況下,我會期待各種各樣的症狀。你描述了這個特定的症狀,所以很可能你的代碼確實有問題。

我上面提到的項目是一個遺留項目,它模擬了類似於COM的東西,並且確實存在編譯器無法找到純虛函數的所有場景,而在派生類中沒有實現。

+0

當你說準備一個小型轉運的一切,有什麼可以做的? – reza 2011-04-18 17:26:40

+0

@reza:確保加載了'dbghelp.dll'並且檢索了所有函數指針(順便說一下,不加載它是沒有創建轉儲文件的最常見原因 - 通常是因爲沒有最新版本的DLL存在系統)。另外,爲它準備一個名字。您在應用程序「懸空」時(即不穩定)嘗試的任何和所有操作都可能會致命。因此,在您的異常處理程序或純虛函數處理程序被調用並且應該創建轉儲文件之前,請嘗試執行所有相關的操作。 – 0xC0000022L 2011-04-18 17:38:38

2

首先,確保你是不是calling pure virtual function。如果不是這種情況,請嘗試在WinDbg下啓動程序。

+0

+1建議在WinDbg下啓動 – 2011-04-18 17:07:11

+0

這是一項NT服務,我該怎麼做? – reza 2011-04-18 17:23:53

+1

@reza,這裏是答案:[如何調試Windows服務](http://support.microsoft.com/kb/824344/en-us) – 2011-04-18 17:39:16

0

如果您的問題不是恆定的最有可能有一些問題了指數的寫這可能導致內存破壞

+2

「我不認爲你可以調試發佈版本。」當然可以。你爲什麼這麼想? – 2011-04-18 16:59:30

+0

我將如何調試版本構建,我有pdb文件和映射文件。 – reza 2011-04-18 17:25:52

1

我敢肯定這是建立自己的錯誤

非常,非常聯合國可能有。這很可能是您的代碼中的一個錯誤。

你可能在slicing an object的某處。如果您的應用程序設置爲在unhanded exceptions上生成轉儲文件,並且您仍然死於沒有轉儲文件,那麼它非常可能的bug位於異常處理程序中。

您需要獲取轉儲文件。這應該是你的首要任務。

0

如果您已經嘗試完全重建,那麼它似乎更可能是一個編碼問題。

你是否在任何構造函數或析構函數中調用任何(純)虛函數?

更有可能的是,您在刪除的對象上調用純虛函數,並且該vtable已被移動以指向父對象。在這種情況下,valgrind(free,linux)或Purify($$$,Windows)將真的能夠幫助你。 VS也可能有一個內存檢查器。

+0

如果應用程序的構建方式允許堆檢查器查看問題,則應用程序驗證程序可以提供幫助。 – 0xC0000022L 2011-04-18 17:16:35

+0

什麼是應用程序驗證器? – reza 2011-04-18 17:27:26

0

我曾經有一個與C++類似的問題。我在某處調用了一個來自構造函數的虛擬函數,所以當調用發生時,該對象還沒有構建,從而解釋了調用的「純」虛函數。如果對對象代替指向對象的指針有不良轉換,它可能也是切片的問題。使用調試器和一步一步/回溯找到源代碼,以便我們可以更好地幫助您。

0

我有同樣的錯誤。我多次查看代碼,從來沒有在構造函數或析構函數中找到虛函數的用法。 問題出在構建系統。我在我的電腦上使用了舊的靜態庫版本,其中一些功能不是純虛擬的,當它變成了新的時候(我增加了一個抽象層)。因爲EXE文件是用舊的靜態庫創建的,但是新的頭文件出現了,所以出現這個錯誤。 因此,如果沒有其他幫助,請確保您的庫和包含文件版本一致。