在linux下產生並除錯core檔案
from :
先看看我用的是個什麼機器:
$ 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
static void sub(void);
int main(void)
static void sub(void)
$ 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
bt#0 0x08048373 in ?? ()
#1 0xbfffd8f8 in ?? ()
#2 0x0804839e in ?? ()
#3 0xb74cc6b3 in ?? ()
#4 0x00000000 in ?? ()
此時用bt看不到b
ackt
race,也就是呼叫堆疊,原來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 }
1112 static void sub(void)
13 {
14 int *p = null;
1516 /* 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.***x;為0則表示生成的core檔案同一命名為core。
可通過以下命令修改此檔案:
echo "1" > /proc/sys/kernel/core_uses_pid
3.core檔案的檢視
-----------------
core檔案需要使用gdb來檢視。
gdb ./a.out
core-file core.***x
使用bt命令即可看到程式出錯的地方。
以下兩種命令方式具有相同的效果,但是在有些環境下不生效,所以推薦使用上面的命令。
1)gdb -core=core.***x
file ./a.out
bt2)gdb -c core.***x
file ./a.out
bt4.開發板上使用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
注意:待除錯的可執行檔案,在編譯的時候需要加-g,core檔案才能正常顯示出錯資訊!有時候core資訊很大,超出了開發板的空間限制,生成的core資訊會殘缺不全而無法使用,可以通過掛載到pc的方式來規避這一點。
在Linux下產生並除錯core檔案
在linux下產生並除錯core檔案 先看看我用的是個什麼機器 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 ...
在Linux下產生並除錯core檔案
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 ...
linux下產生斷錯誤的除錯方法
1.編譯 時,需要加上 g2.開發板上執行 ulimit c unlimited 此處是設定生成的 core 檔案大小 在開發板上執行時,如果有斷錯誤會有 segmentation fault core dumped 紅色標記生成了 core 檔案。如果沒有生成 core 檔案一般是沒有設定 cor...