段錯誤排查之core文件調試


Linux下C程序常常會因為內存訪問錯誤等原因造成segment fault(段錯誤),此時如果系統core dump功能是打開的,那么將會有內存映像轉儲到硬盤上來,之后可以用gdb對core文件進行分析,還原系統發生段錯誤時刻的堆棧情況。這對於我們發現程序bug很有幫助。
     core文件僅僅是一個內存映像(同時加上調試信息),主要是用來調試的。遇到某些無法處理的信號時會產生core文件。
    使用ulimit -a可以查看系統core文件的大小限制;
    使用ulimit -c [kbytes]可以設置系統允許生成的core文件大小,例如:

  1. ulimit -c 0          //不產生core文件
  2. ulimit -c 100        //設置core文件最大為100k
  3. ulimit -c unlimited  //不限制core文件大小

    先看一段造成段錯誤的程序,如下所示。

  1. #include <stdio.h>
  2. int main()
  3. {
  4.         char *ptr = "hello world";
  5.         *ptr = 0;
  6.         return 0;
  7. }

    編譯后,運行結果如下所示。
    
    
    此時並沒有產生core文件,接下來使用ulimit -c設置core文件大小為無限制,再執行./test程序,結果如下所示。
    
    
    可見core文件已經生成,接下來可以用gdb進行分析,查看堆棧情況了。
    
    
    從上述輸出可以清楚的看到,段錯誤出現在test.c的第6行,問題已經清晰地定位到了。
    另外,也可以這樣進行打開core文件,如下所示。
    
    
    很多系統默認的core文件大小都是0,我們可以通過在shell的啟動腳本/etc/bashrc等來加入ulimit -c命令來指定core文件大小,從而確保core文件能夠生成。
    除此之外,還可以在/proc/sys/kernel/core-pattern里設置core文件的文件名模板,詳情請看core的官方man手冊。

 

 

問題:

    我們在運行程序的時候經常會碰到段錯無 segment fault 的錯誤,這時候我們需要用gdb ,然后用core-file 把生成的core.*** 文件進行分析。

但今天發現一個很奇怪的現象,就是在生產的所有 core.*** 大小都是0字節。

 

[root@qljt pf]# ulimit -c
unlimited

 

所以應該不是ulimited 的問題。

 

問題所在:

    我跑得程序(生成core.*** 的程序)並不是在linux的目錄下,而是在windows 的某個分區下(該分區是通過 vmtool "/mnt/hgfs/***" 和linux 共享),導致

生成的core.*** 都是0 字節大小。

 

解決問題:

    把需要運行的程序拷貝到linux 的根目錄下運行,生成的core.*** 馬上正常。

原文:http://blog.chinaunix.net/uid-26548237-id-3954090.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM