linux gdb除錯core檔案

2021-06-07 23:53:08 字數 3845 閱讀 5688

$ 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。

此時用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 

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

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時間

%e - insert coredumping executable name into filename 新增命令名

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

bt

linux gdb除錯彙編

1 除錯hello,要求編譯時指定了 gstabs選項 2 執行hello deepfuture lx deepfuture lx desktop private mytest hello hello,world abcd 3 用gdb開啟hello deepfuture lx deepfuture...

Linux gdb除錯總結

進入除錯 1 輸入gdb 檔名 2 輸入gdb file 檔名 l 顯示源 預設顯示main函式所在檔案的源 list 檔名 num 顯示指定檔案指定行附近的源 b breakpoint的簡寫,設定斷點。b 行號 給指定行新增斷點 b 函式名 給指定函式新增斷點 b 檔名 行號 給指定檔案指定行新增...

Linux gdb除錯總結

在windows作業系統下,我們的執行程式有兩個版本。debug開發除錯版本 得到的可執行檔案.exe檔案相對較大,其中包含除錯資訊。且不做任何優化,未開發人員提供強大的應用除錯能力 release發行版本 檔案相對較小,不包含除錯資訊,並進行了各種優化,以期達到 最小和速度最優。為使用者的使用提供...