我正在gdb中運行我的C++程序。我沒有真正使用gdb經歷過,但我越來越喜歡消息:使用GDB和C++調試內存錯誤
warning: HEAP[test.exe]:
warning: Heap block at 064EA560 modified at 064EA569 past requested size of 1
我如何追查這個地方在發生?查看記憶並沒有給我任何線索。
謝謝!
我正在gdb中運行我的C++程序。我沒有真正使用gdb經歷過,但我越來越喜歡消息:使用GDB和C++調試內存錯誤
warning: HEAP[test.exe]:
warning: Heap block at 064EA560 modified at 064EA569 past requested size of 1
我如何追查這個地方在發生?查看記憶並沒有給我任何線索。
謝謝!
因此,你正在破壞你的堆。請記住一個不錯的GDB tutorial。
我的正常做法是在已知的代碼中設置一箇中斷點。一旦它到達那裏,直到你出錯。通常你可以通過這種方式來確定問題。
因爲你遇到了堆錯誤,我認爲它與你放在堆上的東西有關,所以要特別注意變量(我想你可以在GDB中使用print來確定它的內存地址和這可能能夠將你與錯誤出現的地方同步)。你還應該記住,輸入函數和函數返回與堆一起玩,所以它們可能是你問題所在的地方(特別是如果你在從函數返回之前弄亂你的堆)。
您大概可以使用稱爲「觀察點」的功能。這就像一個斷點,但是當內存被修改時,調試器停止。
我介紹瞭如何使用這個在answer到一個不同的問題,一個粗略的想法。
如果你可以使用其他工具,我強烈建議嘗試Valgrind。它是一個工具框架,它可以以一種方式運行你的代碼,通常它可以停止在導致錯誤的確切指令上。通過這種方式,堆錯誤通常很容易找到。
你可以嘗試一件事,因爲這與標準libc相同,配置了MALLOC_CHECK_ envronment變量(man libc)。
如果您退出gdb(如果您的應用程序退出了,只需使用「r」重新運行它),您可以在該地址設置一個內存斷點「hbreak 0x64EA569」,還可以使用「help hbreak」配置條件的或其他breakpoitn啓用/禁用選項,以防止過度進入該斷點......
您可以只配置一個日誌文件,設置日誌...設置一個堆棧跟蹤每個休息「display/bt -4 「,然後按r,然後按住回車鍵,讓它滾動 」或使用C##繼續x次...等等。「,最終你會看到同樣的斷言,那麼你現在就可以擁有(由於display/bt)一個堆棧跟蹤,你可以通過該地址修改哪些代碼...
當我試圖重新分配指向我的結構的指針數組時,我遇到了類似的問題,但是我重新分配爲int數組(因爲我從代碼中獲得了代碼並忘記更改它)。編譯器沒有糾正我,因爲它無法檢查什麼大小的參數。 我的變量是:
itemsetList_t ** iteration_isets;
所以在realloc的而不是有:
iteration_isets = realloc(iteration_isets, sizeof(itemsetList_t *) * max_elem);
我:
iteration_isets = realloc(iteration_isets, sizeof(int) * max_elem);
這引起了我一堆問題。