簡體   English   中英

如何調試這種內存損壞?

[英]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 ++的內存分析工具,例如:
memproMTuner 您可以免費使用試用版。

由於我們這里沒有某種代碼訪問權限,因此我不得不假設當main的作用域被破壞時,以某種神奇的方式調用了free(也許使用了智能指針?也許還有一些復雜的宏定義...可以真的不知道)。 我將嘗試通過以下方式重新創建問題:

int main () 
{
       {
           allocating_resource();
           call_other_libs();
           ...
           release_resource();
       }
       return 0;
}

要么

  int main()
  {
    mainhelper();
    return 0;
  }

其中mainhelper將包含主要代碼。

希望在執行這些步驟之后,該問題將繼續存在,並且不會因您的建議而完全損壞日志,因為該程序將終止。

另外,嘗試使用優化標志(更像是禁用它)並添加-ggdb3調試標志(此處為gcc)。 也許它將以某種奇怪的方式幫助您。

有關此問題的其他一些帖子(如果您尚未簽出):

主返回后的分段錯誤

程序返回0后收到SIGSEGV錯誤

它們都說明更多相同點: valgrind應該能夠給出答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM