2009-04-23 96 views
0

我調試其最終崩潰與下列消息之一的軟件:調試Visual C++內存分配問題

1. DAMAGE: after normal block (#24729280) at 0x00D710E0 
2. Debug Assertion Failed 
    Program: D:\Soft\Test.exe 
    File: dbgheap.c 
    Line: 1017 

    Expression: _BLOCK_TYPE_IS_VALID(phead->nBlockUse) 

這個軟件是真的老了,但現在改變它不是一個選項。它是用Visual C++ 6.0編寫的。我們猜測它是某種緩衝區溢出,所以我們試圖找到方法來檢測它發生的位置。

我發現有關PageHeap(它似乎能夠告訴我我想要什麼)和GFlags的信息,但似乎我無法使其工作。

我創建了一個測試程序:

char* test; 
test = new char[5]; 
test[5] = 'a'; 
delete[] test; 

這就引起一個錯誤:

DAMAGE: after normal block (#55) at 0x1671920 

然後,我試圖附着頁堆將其通過運行:

gflags.exe /p /enable MemoryTest.exe /full 

,然後重新運行它(通過Visual C++ 6.0界面和通過Windows資源管理器)都會導致相同的錯誤。

然後我試圖編譯發行版本,並運行它通過Visual C++ 6.0接口得到錯誤:

User breakpoint called from code at 0x7c90120e 

,並從Windows資源管理器,我剛剛得到了Windows對話框,詢問我送錯誤報告。

我錯過了什麼?

回答

1

通過附加到Windbg,您可以在發佈模式下運行您的應用程序。

  • 啓用gflags(正如你提到的 )
  • 開始在釋放 模式的應用。
  • 使用Windbg中的Attach to process選項將其附加到Windbg。
  • 配置 版本PDB的正確路徑。
  • 重新加載PDB手動使用 .reload /f如果自動加載失敗 。
  • 執行用例。

WinDbg會在發生異常時停止執行。對於每個第一次機會例外,分析原因。它可能是崩潰的錯誤之一。

+0

我試圖用它來調試我構建的示例程序。管理到步驟5(重新加載PDB文件),然後按f5。那是當我得到兩個錯誤:損壞的後綴模式和損壞的堆塊,但我不明白如何或爲什麼發生...... – Rodrigo 2009-04-23 18:58:05

0

在使用gFlags/PageHeap之前,我建議您檢查Access Violation異常。首先使用Build-> Start Debug-> Attach to process選項附加進程。一旦連接,通過轉到Debug-> Exceptions選擇Access Violation並選中Stop Always複選框來啓用訪問衝突異常。然後檢查您的調試器是否捕獲任何訪問衝突異常。

+0

對於真正的程序(而不是測試程序),它捕獲了一些有關CTreeView組件的例外,但我不認爲它是我的問題的根源。 當我用我的測試程序進行測試時,它沒有發現任何東西,並像往常一樣墜毀,發生同樣的錯誤。 – Rodrigo 2009-04-23 14:29:18