[英]How to debug such memory corruption?
int main () {
allocating_resource();
call_other_libs();
...
release_resource();
return 0;
}
程序運行后,主程序返回。
在訪問returne 0
,堆棧指針指向main()中的錯誤地址,然后可執行文件崩潰。
程序收到信號SIGSEGV,分段故障。
GI __libc_free(mem = 0x3f21a843)在malloc.c:2020
我猜有一些非法的內存訪問,但是代碼庫太大,無法檢查。 復查和分析所有代碼都不現實。
禁用某些代碼也是不可接受的,因為代碼量很大。
對於核心轉儲,沒有任何提示可以使用,因為它在主堆棧和執行return子句后崩潰了。
我知道如何使用gdb,但是該項目太大,似乎很難找到根本原因。
valgrind --tool = memcheck似乎沒有幫助。
如何解決這樣的問題?
您可以使用GDB。 該stackoverflow鏈接包含有關如何使用GDB進行調試的詳細信息。 如果您使用Google,則可以在GDB上獲得許多此類有用的鏈接。
如果您確定與內存相關的問題,也可以使用valgrind 。
還有一個名為MemProf的內存分析器。 它為每個功能分配了內存,還可以檢測問題。 有關詳細信息,請參見鏈接。
還有一些特定於c ++的內存分析工具,例如:
mempro和MTuner 。 您可以免費使用試用版。
由於我們這里沒有某種代碼訪問權限,因此我不得不假設當main的作用域被破壞時,以某種神奇的方式調用了free(也許使用了智能指針?也許還有一些復雜的宏定義...可以真的不知道)。 我將嘗試通過以下方式重新創建問題:
int main ()
{
{
allocating_resource();
call_other_libs();
...
release_resource();
}
return 0;
}
要么
int main()
{
mainhelper();
return 0;
}
其中mainhelper將包含主要代碼。
希望在執行這些步驟之后,該問題將繼續存在,並且不會因您的建議而完全損壞日志,因為該程序將終止。
另外,嘗試使用優化標志(更像是禁用它)並添加-ggdb3
調試標志(此處為gcc)。 也許它將以某種奇怪的方式幫助您。
有關此問題的其他一些帖子(如果您尚未簽出):
它們都說明更多相同點: valgrind
應該能夠給出答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.