在Linux下產生並調試core檔案

來源:互聯網
上載者:User

先看看我用的是個什麼機器:

$ uname -a
Linux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 EDT 2004 i686 i686 i386 GNU/Linux

再看看預設的一些參數,注意core file size是個0,程式出錯時不會產生core檔案了。

$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7168
virtual memory (kbytes, -v) unlimited

寫個簡單的程式,看看core檔案是不是會被產生。

$ more foo.c

#include <stdio.h>

static void sub(void);

int main(void)
{
    sub();
    return 0;
}

static void sub(void)
{
    int *p = NULL;

    /* derefernce a null pointer, expect core dump. */
    printf("%d", *p);
}

$ gcc -Wall -g foo.c
$ ./a.out
Segmentation fault

$ ls -l core.*
ls: core.*: No such file or directory

沒有找到core檔案,我們改改ulimit的設定,讓它產生。1024是隨便取的,要是core檔案大於1024個塊,就產生不出來了。

$ ulimit -c 1024

$ ulimit -a
core file size (blocks, -c) 1024
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7168
virtual memory (kbytes, -v) unlimited

$ ./a.out
Segmentation fault (core dumped)
$ ls -l core.*
-rw------- 1 uniware uniware 53248 Jun 30 17:10 core.9128

注意看上述的輸出資訊,多了個(core dumped)。確實產生了一個core檔案,9128是該進程的PID。我們用GDB來看看這個core。

$ gdb --core=core.9128
GNU gdb Asianux (6.0post-0.20040223.17.1AX)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-asianux-linux-gnu".
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0 0x08048373 in ?? ()
(gdb) bt
#0 0x08048373 in ?? ()
#1 0xbfffd8f8 in ?? ()
#2 0x0804839e in ?? ()
#3 0xb74cc6b3 in ?? ()
#4 0x00000000 in ?? ()

此時用bt看不到backtrace,也就是呼叫堆疊,原來GDB還不知道符號資訊在哪裡。我們告訴它一下:

(gdb) file ./a.out
Reading symbols from ./a.out...done.
Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) bt
#0 0x08048373 in sub () at foo.c:17
#1 0x08048359 in main () at foo.c:8

此時backtrace出來了。

(gdb) l
8         sub();
9         return 0;
10     }
11
12     static void sub(void)
13     {
14         int *p = NULL;
15
16         /* derefernce a null pointer, expect core dump. */
17         printf("%d", *p);
(gdb)

 

在程式不尋常退出時,核心會在當前工作目錄下產生一個core檔案(是一個記憶體映像,同時加上調試資訊)。使用gdb來查看core檔案,可以指示出導致程式出錯的代碼所在檔案和行數。

1.core檔案的產生開關和大小限制
---------------------------------
 1)使用ulimit -c命令可查看core檔案的產生開關。若結果為0,則表示關閉了此功能,不會產生core檔案。
 2)使用ulimit -c filesize命令,可以限制core檔案的大小(filesize的單位為kbyte)。若ulimit -c unlimited,則表示core檔案的大小不受限制。如果產生的資訊超過此大小,將會被裁剪,最終產生一個不完整的core檔案。在調試此core檔案的時候,gdb會提示錯誤。

2.core檔案的名稱和產生路徑
----------------------------
core檔案產生路徑:
輸入可執行檔運行命令的同一路徑下。
若系統產生的core檔案不帶其他任何副檔名稱,則全部命名為core。新的core檔案產生將覆蓋原來的core檔案。

1)/proc/sys/kernel/core_uses_pid可以控制core檔案的檔案名稱中是否添加pid作為擴充。檔案內容為1,表示添加pid作為副檔名,產生的core檔案格式為core.xxxx;為0則表示產生的core檔案同一命名為core。
可通過以下命令修改此檔案:
echo "1" > /proc/sys/kernel/core_uses_pid

2)proc/sys/kernel/core_pattern可以控制core檔案儲存位置和檔案名稱格式。
可通過以下命令修改此檔案:
echo "/corefile/core-%e-%p-%t" > core_pattern,可以將core檔案統一產生到/corefile目錄下,產生的檔案名稱為core-命令名-pid-時間戳記
以下是參數列表:
    %p - insert pid into filename 添加pid
    %u - insert current uid into filename 添加當前uid
    %g - insert current gid into filename 添加當前gid
    %s - insert signal that caused the coredump into the filename 添加導致產生core的訊號
    %t - insert UNIX time that the coredump occurred into filename 添加core檔案產生時的unix時間
    %h - insert hostname where the coredump happened into filename 添加主機名稱
    %e - insert coredumping executable name into filename 添加命令名

3.core檔案的查看
-----------------
 core檔案需要使用gdb來查看。
 gdb ./a.out
 core-file core.xxxx
 使用bt命令即可看到程式出錯的地方。
以下兩種命令方式具有相同的效果,但是在有些環境下不生效,所以推薦使用上面的命令。
1)gdb -core=core.xxxx
file ./a.out
bt
2)gdb -c core.xxxx
file ./a.out
bt

4.開發板上使用core檔案調試
-----------------------------
如果開發板的作業系統也是linux,core調試方法依然適用。如果開發板上不支援gdb,可將開發板的環境(依賴庫)、可執行檔和core檔案拷貝到PC的linux下。
在 PC上調試開發板上產生的core檔案,需要使用交叉編譯器內建的gdb,並且需要在gdb中指定solib-absolute-prefix和 solib-search-path兩個變數以保證gdb能夠找到可執行程式的依賴庫路徑。有一種建立設定檔的方法,不需要每次啟動gdb都配置以上變數,即:在待運行gdb的路徑下建立.gdbinit。
設定檔內容:
set solib-absolute-prefix YOUR_CROSS_COMPILE_PATH
set solib-search-path YOUR_CROSS_COMPILE_PATH
set solib-search-path YOUR_DEVELOPER_TOOLS_LIB_PATH
handle SIG32 nostop noprint pass

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/borefo/archive/2009/12/18/5029555.aspx

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.