2008-12-22 62 views
6

我有一些代碼在MS VC++ 6.0,我正在調試。出於某種原因,在這個我試圖刪除一些動態分配的內存的地方,它會中斷,並且我會彈出一個消息框,提示「用戶斷點在代碼中被調用,然後反彙編窗口彈出,I看到用戶斷點

*memory address* int  3 

奇怪的是,沒有什麼地方在我打電話像這樣的彙編指令代碼(我認爲ASM INT 3是用於x86硬件中斷命令?)..

什麼可能造成這種情況?

編輯:回答:我的代碼是「行走結束」的數組,但只有在標記爲Visual Studio的位置調試0xFDFDFDFD,這被稱爲NoMan'sLand圍欄..我認爲它也被稱爲Off-by-one錯誤..這個數組與我在發生錯誤時釋放內存的點無關。這使得它很難被發現.. :(

+0

只是好奇 - 你是否通過單步執行彙編指令來找到這個調試堆不喜歡或做了一些其他工具/技術幫助? – 2008-12-22 19:24:41

+0

我看了一下這個網站http://www.highprogrammer.com/alan/windev/visualstudio.html,它說:0xFDFDFDFD是一個內存值,MSVC++調試器用來指示數組中的邊界來檢測off-by-一個錯誤..我檢查了我的指針,並單步穿過迭代.. .. – krebstar 2008-12-22 23:11:57

+0

源代碼,發現我沒有正確限定我的一個陣列..所以我想這只是我需要正確檢查我的指針的情況:) – krebstar 2008-12-22 23:12:37

回答

8

你可能打在已經發現堆損壞的調試堆程序代碼。

什麼調用堆棧看,當你打到INT 3樣?

編輯:根據您的意見堆棧跟蹤,日常_CrtIsValidHeapPointer()是說,被釋放的指針是壞下面是代碼從MSVC的DBGHEAP.C源代碼片段:

/* 
    * If this ASSERT fails, a bad pointer has been passed in. It may be 
    * totally bogus, or it may have been allocated from another heap. 
    * The pointer MUST come from the 'local' heap. 
    */ 
    _ASSERTE(_CrtIsValidHeapPointer(pUserData)); 

pUserData會是纈氨酸你正在刪除的指針。

3

(我認爲ASM INT 3是用於x86硬件斷點 命令?

它。這就是所謂的「硬件斷點」。如果你正在使用VS調試器項目源代碼就像一個斷點(但是在代碼中),從vs2005開始,如果你的應用程序沒有任何調試器,那麼應​​用程序就會崩潰,就像它啓動了一個非託管異常一樣。 COMPA ny,有一個簡單的宏用於在代碼中添加斷點。這可以代替斷言和一些(硬和罕見的)情況下的例外:

#define BREAKPOINT __asm { int 3; } 

BREAKPOINT; 

參見:

所以我建議尋找一些宏觀或對象這樣做,或者它可能在你沒有代碼的模塊(dll/lib)中使用?