GDB 除錯 C 程式 core dump

2021-07-15 08:31:50 字數 2895 閱讀 4301

gdb 的一些常用命令, 及在程式發生段錯誤後如何通過除錯 core dump 迅速定位到出錯位置.

不羅列一大堆命令了, 只是把碰到的/用過的整理一下, 以後再使用到新的命令, 再補充. 有幾篇總結的比較好的文章可以參考: 《linux c/c++ gdb除錯(概述)上》、《linux c/c++ gdb除錯(概述)下》、《手把手教你玩轉gdb(二)——breakpoint, watchpoint和catchpoint》

為了能使用 gdb 進行除錯, 需要新增 -g 選項新增除錯資訊.

g++ -g test.cpp -o test

使用 gdb test 即可以進入除錯程式, 以下列出幾個常用命 令.

程式執行時, 經常會因為段錯誤(segment fault)而退出, 作業系統會把此程式當前記憶體資訊 dump 到磁碟上(詳見 wiki), 即生成 core 檔案. 對 core 進行分析可以很快分析出導致程式 crash 的地方.

系統預設不會生成 core 檔案, 需要進一步設定. core 檔案的生成依賴於 shell 的設定, 在 shell 中執行命令: ulimit -a, 從第一行的設定項可以看到系統設定的 core file size 為 0, 即不生成 core file.

使用命令: ulimit -c unlimited 可以設定 core file size 為無限.

在 c++ 中製造乙個 segment falt 太容易了, 直接給乙個空指標賦值就可以了.

int main(int argc, char const *argv)

儲存檔案為 coredumptest.cpp, 編譯並執行, 即可以現磁碟上多了乙個 core 檔案, 就是這個程式發生段錯誤 dump 下來的程序資訊.

使用 gdb ./coredumptest core 來除錯 core, 發現 gdb 直接就定位到了出錯的語句(第4行賦值語句), 還可以通過 print 來檢視當前上下文變數, 如指標 p 的值為 nullptr.

上面的例子太簡單了, 下面通過乙個稍微複雜的例子來介紹一下 gdb 中命令 backtrace 和 frame 的使用. 下面**很簡單, 就是越界訪問, 用 vector 是為了體現呼叫層次…

#include 

using

namespace

std;

int main(int argc, char

const *argv)

(5). 除錯稍複雜 core 檔案

編譯執行程式, 生成 core 檔案, 使用 gdb 來除錯 core, 可以看到此時直接定位到的地方是庫函式中的某一行;

庫函式都是經過千錘百鍊, 基本不可能出錯, 所以我們先從自己的程式找起. 這時我們需要知道的是**是從哪條語句執行到這裡的, 使用 backtrace(或者 where) 命令列出當前呼叫堆疊, 再使用 frame n 命令列出第 n 層堆疊的資訊, 就可以直接看到出錯的**語句了, 接下來就是進一步分析了.

(1). 首先利用file core.19344命令可以得到

core.19344: elf 32-bit lsb core file intel 80386, version 1 (sysv), svr4-style, from 『cmm_test_tool』

可以看出core.19344是由cmm_test_tool這個工程產生。

(2). 接著就可以利用命令gdb進行查詢,格式為gdb 工程名 core檔名,例如 gdb cmm_test_tool core.19344

(3). 最後乙個步驟是輸入where,找到錯誤發生的位置和堆疊,如下:

(gdb) where

#0 0×4202cec1 in __strtoul_internal () from /lib/i686/libc.so.6

#1 0×4202d4e7 in strtoul () from /lib/i686/libc.so.6

#2 0×0804b4da in getmaxidfromdb (get_type=2, max_id=0×806fd20) at cmm_test_tool.c:788

#3 0×0804b9d7 in constrctvodprogram (vod_program=0×40345bdc) at cmm_test_tool.c:946

#4 0×0804a2f4 in tvrequestthread (arg=0×0) at cmm_test_tool.c:372

#5 0×40021941 in pthread_start_thread () from /lib/i686/libpthread.so.0 (gdb)

至此,可以看出檔案出錯的位置是函式 getmaxidfromdb ,兩個引數分別是2和0×806fd20,這個函式位於源**的788行,基於此,我們就可以有針對性的找到問題的根源,並加以解決。

設定 core file size 在所有 shell 都生效, 不要每次開啟乙個 shell 就要設定一下.

【**:

3 GDB程式除錯及Coredum

gdb是gnu發布的一款功能強大的程式除錯工具。gdb主要完成下面三個方面的功能 1 啟動被除錯程式。2 讓被除錯的程式在指定的位置停住。3 當程式被停住時,可以檢查程式狀態 如變數值 1.編譯生成可執行檔案 gcc g tst.c o tst 2.啟動gdb gdb tst 3.在 main函式處...

macOS使用LLDB除錯coredump

對於segmentation fault或者異常退出的程式,macos中使用lldb除錯工具 linux裡是gdb 可以更方便的判斷問題出在 如下 開啟core檔案生成開關 注意這個僅在當前terminal視窗有用 unlimited表示不限制core檔案大小,可以使用 c檢視是否開啟,預設是0 使...

用gdb除錯C與C 程式

1.gdb簡介 1 介紹 gdb是linux下乙個gnu除錯程式,是用來除錯c與c 程式的強力偵錯程式。能夠讓使用者在程式執行時觀察程式的內部結構和記憶體的使用情況。2 功能 按照自定義的方式啟動執行需要除錯的程式。可以使用指定位置和條件表示式的方式來設定斷點。程式暫停時的值的監視。動態改變程式的執...