在程式不尋常退出時,核心會在當前工作目錄下生成乙個core檔案(是乙個記憶體映像,同時加上除錯資訊)。使用gdb來檢視core檔案,可以指示出導致程式出錯的**所在檔案和行數。
首先看看預設的一些core的引數,注意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 **者注: 使用-c unlimited不限制core檔案大小)
$ 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。
(轉者注:預設生成的檔案就叫core,不帶pid,如果要帶pid需要設定,通過echo "1" > /proc/sys/kernel/core_uses_pid能夠設定pid)
$ gdb --core=core.9128
#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 }
1112 static void sub(void)
13 {
14 int *p = null;
1516 /* derefernce a null pointer, expect core dump. */
17 printf("%d", *p);
linux下除錯core的命令,察看堆疊狀態命令
在程式不尋常退出時,核心會在當前工作目錄下生成乙個core檔案 是乙個記憶體映像,同時加上除錯資訊 使用gdb來檢視core檔案,可以指示出導致程式出錯的 所在檔案和行數。首先看看預設的一些core的引數,注意core file size是個0,程式出錯時不會產生core檔案了。ulimit a c...
Linux下除錯總結
感覺linux環境下段錯誤的產生原因及除錯方法小結寫的不錯,列舉了幾個主要的除錯方式。有幾點補充 1.在使用core dump的時候,關於開啟 關閉生成core檔案的命令 ulimit c unlimited 使core檔案大小沒有限制。ulimit c 0 限制core檔案大小為0,即不產生cor...
linux除錯core檔案
core dump test.c 1 include 2 3 const char str test 45 void core test 6 9 10 int main 11 以上為除錯 編譯完成以後 當前目錄ls 已經找到了core 檔案 root localhost gongmh ls bate...