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產生此訊號。