文章目錄
- 一、背景
- 二、gdb的指令與使用
- 1.gdb的基本指令,
- 2.gdb指令的簡單使用
- 1.進入gdb模式
- 2.實體說明
- 三、除錯coredump檔案
- 前提:本質上是在除錯程式崩潰之后的記憶體鏡像檔案,
- 記憶體鏡像檔案保存的是,程式在崩潰的一瞬間記憶體當中的值
一、背景
- 程式的發布方式有兩種,debug和release模式,要在linux中除錯,需要使用到一個工具——gdb除錯器,
- gdb除錯器類似于VS中的debug模式,
- Linux gcc/g++出來的二進制程式,默認是release模式
- 要使用debug模式,必須在源代碼生成二進制程式的時候,加上-g選項!
二、gdb的指令與使用
1.gdb的基本指令,
首先列舉下gdb除錯器的基本指令,
- list/l 行號:顯示binFile源代碼,接著上次的位置往下列,每次列10行,
- list/l 函式名:列出某個函式的源代碼,
- r或run:運行程式,
- n 或 next:單條執行,
- s或step:進入函式呼叫,
- break(b)行號:在某一行設定斷點,
- break 函式名:在某個函式開頭設定斷點,
- info break :查看斷點資訊,
- finish:執行到當前函式回傳,然后停下來等待命令,
- print(p):列印運算式的值,通過運算式可以修改變數的值或者呼叫函式 ,
- p變數:列印變數值,
- set var:修改變數的值,
- continue(或c):從當前位置開始連續而非單步執行程式,
- run(或r):從開始連續而非單步執行程式,
- delete breakpoints:洗掉所有斷點,
- delete breakpoints n:洗掉序號為n的斷點,
- disable breakpoints:禁用斷點,
- enable breakpoints:啟用斷點,
- info(或i) breakpoints:參看當前設定了哪些斷點,
- display 變數名:跟蹤查看一個變數,每次停下來都顯示它的值,
- undisplay:取消對先前設定的那些變數的跟蹤,
- until X行號:跳至X行 ,
- breaktrace(或bt):查看各級函式呼叫及引數,
- info(i) locals:查看當前堆疊幀區域變數的值,
- quit / ctrl+d:退出gdb,
2.gdb指令的簡單使用
前面介紹了gdb除錯器的一些指令,現在選一些指令實際應用一下,
1.進入gdb模式
1. vim一個簡單的sum.c檔案:

2. 使用gcc -g指令,生成可以gdb的檔案:

3. gdb + 檔案名,進入除錯模式:


2.實體說明
出現如上界面,表示已經進入了gdb模式,接下來介紹幾個gdb下的指令的使用,
-
list/l 行號:輸入l+行號則跳到輸入行號的位置,只輸入l則從第一行開始顯示十行內容,在輸入l會跳轉到后面十行,如圖,


-
list/l 函式名:列出某個函式名,以sum.c的sum函式為例,輸入l sum
, -
r或run:運行程式, 輸入 r,可以看到輸出了列印結果:11

-
break/b 行號:在某一行設定斷點,例如現在在12,13,14行分別設定斷點
,設定成功會有提示,并給出斷點序號Breakpoint n, -
info break(i b):查看斷點資訊,輸入info break
,可以看到斷點資訊,地址和所在行號, -
disable 斷點的序號:使斷點失效

可以看到,使斷點1,2失效后,執行程式直接跳到了斷點3處,
7. enable 斷點的序號:使斷點生效
8. delete breakpoints:洗掉所有斷點
9. delete breakpoints n:洗掉序號為n的斷點
,洗掉斷點1后,執行i b,斷點1消失,
-
n或next:單條執行,相當于windows中的逐程序執行,VS中的F10(需要先run)

單條執行,不進入函式內部 -
s或step:進入函式呼叫,相當于windows中的逐陳述句執行,VS中的F11(需要先run)

執行s后,進入了函式sum內部并逐陳述句執行, -
continue?:從當前位置開始連續而非單步執行程式(遇到下一個斷點時就會停止運行)

-
print(p):列印變數的值
,首先執行到int a后,執行p a,顯示a的值為5
三、除錯coredump檔案
前提:本質上是在除錯程式崩潰之后的記憶體鏡像檔案,
產生coredump檔案的條件:
1.linux作業系統當中,需要設定core size的大小,使用指令 ulimit -c size,如:
,可執行該陳述句將core size大小設定為無窮,這樣當除錯程式崩潰后,就會生成記憶體鏡像檔案
2.磁盤大小足夠
記憶體鏡像檔案保存的是,程式在崩潰的一瞬間記憶體當中的值
執行gdb [可執行程式][coredump檔案],可查看coredump檔案的資訊,獲悉是什么地方發生了錯誤,
舉個例子:
,首先創建一個明顯有空指標賦值的錯誤檔案,然后gcc編譯并添加-g,

編譯完成后,執行編譯后的檔案testfault,可以發現顯示了段錯誤(吐核)的錯誤,這個錯誤就是記憶體訪問越界或者空指標引起的,ls查看串列檔案

出現了core.20390的檔案 gdb進入,
主要的資訊在倒數幾行,program terminated with signal 11,Segmentaion fault表示程式收到了11號信號,產生了段錯誤,

圈出來的地方表示,崩潰的代碼出現在testfault.c檔案的第七行,
還可以通過:
1. bt:查看呼叫堆疊
2.f[堆疊序號]:跳轉到某一個具體的堆疊

可以看到執行bt后,呼叫堆疊的資訊列出,執行f 0跳到堆疊處,看到錯誤行,
tips:
- 11信號:解參考空指標,解參考野指標,越界訪問記憶體
- 6號信號:double free
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/267007.html
標籤:其他
