天天看點

gdb core 程序異常退出 當機dump來判斷當機原因

在程式不尋常退出時,核心會在目前工作目錄下生成一個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會提示錯誤。

5. core 檔案

  * 開啟或關閉core檔案的生成

  ulimit -c 可以檢視是否打開此選項,若為0則為關閉;

  ulimit -c 0可手動關閉

  ulimit -c 1000 為設定core檔案大小最大為1000k

  ulimit -c unlimited 設定core檔案大小為不限制大小

  很多系統在預設的情況下是關閉生成core檔案的,這個指令可以加到你的profile中去

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

gdb跟蹤守護程序 set follow-fork-mode child

gdb跟蹤多線程 info threads

set scheduler-locking off|on|step

估計是實際使用過多線程調試的人都可以發現,在使用step或者continue指令調試目前被調試線程的時候,其他線程也是同時執行的,怎麼隻讓被調試程式執行呢?通過這個指令就可以實作這個需求。

off 不鎖定任何線程,也就是所有線程都執行,這是預設值。

on 隻有目前被調試程式會執行。

step 在單步的時候,除了next過一個函數的情況(熟悉情況的人可能知道,這其實是一個設定斷點然後continue的行為)以外,隻有目前線程會執行。

當程式接收到以下UNIX信号會産生core檔案:

名字 說明 ANSI C POSIX.1 SVR4 4.3+BSD 預設動作
SIGABRT 異常終止(abort) . . . . 終止w/core
SIGBUS 硬體故障 . . . 終止w/core
SIGEMT 硬體故障 . . 終止w/core
SIGFPE 算術異常 . . . . 終止w/core
SIGILL 非法硬體指令 . . . . 終止w/core
SIGIOT 硬體故障 . . 終止w/core
SIGQUIT 終端退出符 . . . 終止w/core
SIGSEGV 無效存儲通路 . . . . 終止w/core
SIGSYS 無效系統調用 . . 終止w/core
SIGTRAP 硬體故障 . . 終止w/core
SIGXCPU 超過CPU限制(setrlimit) . . 終止w/core
SIGXFSZ 超過檔案長度限制(setrlimit) . . 終止w/core

在系統預設動作列,“終止w/core”表示在程序目前工作目錄的core檔案中複制了該程序的存儲圖像(該檔案名為core,由此可以看出這種功能很久之前就是UNIX功能的一部分)。大多數UNIX調試程式都使用core檔案以檢查程序在終止時的狀态。

core 檔案的産生不是POSIX.1所屬部分,而是很多UNIX版本的實作特征。UNIX第6版沒有檢查條件 (a)和(b),并且其源代碼中包含如下說明:“如果你正在找尋保護信号,那麼當設定-使用者-ID指令執行時,将可能産生大量的這種信号”。4.3 + BSD産生名為core.prog的檔案,其中prog是被執行的程式名的前1 6個字元。它對core檔案給予了某種辨別,是以是一種改進特征。

表中“硬體故障”對應于實作定義的硬體故障。這些名字中有很多取自UNIX早先在DP-11上的實作。請檢視你所使用的系統的手冊,以确切地确定這些信号對應于哪些錯誤類型。

下面比較詳細地說明這些信号。

? SIGABRT 調用abort函數時産生此信号。程序異常終止。

? SIGBUS 訓示一個實作定義的硬體故障。

? SIGEMT 訓示一個實作定義的硬體故障。

EMT這一名字來自PDP-11的emulator trap 指令。

? SIGFPE 此信号表示一個算術運算異常,例如除以0,浮點溢出等。

? SIGILL 此信号訓示程序已執行一條非法硬體指令。

4.3BSD由abort函數産生此信号。SIGABRT現在被用于此。

? SIGIOT 這訓示一個實作定義的硬體故障。

IOT這個名字來自于PDP-11對于輸入/輸出TRAP(input/output TRAP)指令的縮寫。系統V的早期版本,由abort函數産生此信号。SIGABRT現在被用于此。

? SIGQUIT 當使用者在終端上按退出鍵(一般采用Ctrl-\)時,産生此信号,并送至前台進

程組中的所有程序。此信号不僅終止前台程序組(如SIGINT所做的那樣),同時産生一個core檔案。

? SIGSEGV 訓示程序進行了一次無效的存儲通路。

名字SEGV表示“段違例(segmentation violation)”。

? SIGSYS 訓示一個無效的系統調用。由于某種未知原因,程序執行了一條系統調用指令,

但其訓示系統調用類型的參數卻是無效的。

? SIGTRAP 訓示一個實作定義的硬體故障。

此信号名來自于PDP-11的TRAP指令。

? SIGXCPU SVR4和4.3+BSD支援資源限制的概念。如果程序超過了其軟C P U時間限制,則産生此信号。

? SIGXFSZ 如果程序超過了其軟檔案長度限制,則SVR4和4.3+BSD産生此信号。

原文:http://bingheleiyu.blog.163.com/blog/static/957381920131182540614/

繼續閱讀