Linux下gdb相關使用方法

2021-10-07 07:21:01 字數 4060 閱讀 9397

目錄

一、進入除錯的方式

二、單執行緒下的gdb

三、多執行緒下的gdb

注1:gdb除錯值core檔案臨時生成,首先使用ulimit -c檢視core檔案大小設定,並可用該命令更改大小設定,當為ulimit -c unlimited時,core檔案大小沒有限制

注2:設定永久生成core檔案:修改檔案/etc/sysctl.conf;將#* soft core 0修改為#* soft core unlimited;使用sysctl -p生效,下次登入即可生效

1、直接進入gdb除錯模式:gdb 可行性檔案

2、先進入gdb,在載入可執行檔案:先執行gdb;然後file 可執行檔案,用以載入可執行檔案

3、直接通過core檔案進行gdb除錯:gdb 可執行檔案 core_file;直接將core檔案和可執行檔案進行關聯除錯

4、先載入可執行檔案,再載入core檔案進行除錯:先gdb 可執行檔案,去引導程式,然後用core-file core_file去載入生成的core_file的core檔案

5、除錯乙個正在執行的程式:先執行程式,然後利用ps -aux | grep 可執行檔案,查詢程式對應的程序號pid,然後進入gdb,使用attach pid進行除錯

13、設定顯示選項:set

(1)set print address on:開啟位址輸出,當程式顯示函式資訊時,gdb會顯出函式的引數位址。系統預設為開啟的

(2)set print array on:開啟陣列顯示,開啟後當陣列顯示時,每個元素佔一行,如果不開啟的話,每個元素則以逗號分隔。這個選項預設是關閉的

(3)set print elements:這個選項主要是設定陣列的,如果你的陣列太大了,那麼就可以指定乙個來指定資料顯示的最大長度,當到達這個長度時,gdb就不再往下顯示了。如果設定為0,則表示不限制

(4)set print null-stop:如果開啟了這個選項,那麼當顯示字串時,遇到結束符則停止顯示。這個選項預設為off

(5)set print pretty on:如果開啟printf pretty這個選項,那麼當gdb顯示結構體時會比較漂亮;該設定會讓結構體更方便檢視

(6)set print union:設定顯示結構體時,是否顯式其內的聯合體資料;該設定會讓結構體內的聯合體也顯示,更方便

(7)set print object:在c++中,如果乙個物件指標指向其派生類,如果開啟這個選項,gdb會自動按照虛方法呼叫的規則顯示輸出,如果關閉這個選項的話,gdb就不管虛函式表了。這個選項預設是off

(8)set print static-members:,當顯示乙個c++物件中的內容是,是否顯示其中的靜態資料成員。預設是on

(9)set print vtbl:gdb將用比較規整的格式來顯示虛函式表時。其預設是關閉的

14、設定自己的環境變數:set $var=value,本方法還可以設定結構體和陣列變數

15、修改程式變數值:print var1=4,意為將變數var1的值修改為4,或者set var var1=5,意為修改var1的值為5

16、檢視當前設定的所有環境變數:show convenience

17、檢視暫存器資訊:

(1)info registers:檢視暫存器情況,處理浮點暫存器,加上對應的暫存器名可以檢視對應暫存器的情況

(2)info all-registers:檢視所有暫存器情況

(3)p $sp:使用print來訪問暫存器的情況,暫存器名字前加個$即可

18、檢視變數的型別:whatis var,輸出為var對應的變數型別,也可用ptype顯示資料型別,但是它可以顯示typedef定義的型別

19、跳轉執行程式:jump,下一條程式位置可以為:檔案的行號,file:line,+number

20、產生指定訊號量:signal 1-29

#define sighup   1 :程序由於控制終端死去或者控制終端發出起命令 

#define sigint   2 :鍵盤中斷所產生的訊號

#define sigquit   3 :鍵盤終止

#define sigill   4 :非法的指令

#define sigtrap   5 :程序遇到乙個追蹤(trace)或者是乙個中斷巢狀

#define sigabrt   6 :由abort系統呼叫所產生的中斷訊號

#define sigiot   6 :類似於sigabrt

#define sigbus   7 :程序試圖使用不合理的記憶體

#define sigfpe   8 :浮點異常

#define sigkill   9 :kill

#define sigusr1  10 :使用者自定義

#define sigse**  11 :段錯誤

#define sigusr2  12 :使用者自定義

#define sigpipe  13 :管道操作時沒有讀只寫

#define sigalrm  14 :由alarm系統呼叫產生的timer時鐘訊號

#define sigterm  15 :收到終端訊號的程序

#define sigstkflt 16 :堆疊錯誤

#define sigchld  17 :子程序向父程序發出的子程序已經stop或者終止的訊號

#define sigcont  18 :繼續執行的訊號

#define sigstop  19 :stop

#define sigtstp  20 :鍵盤所產生的stop訊號

#define sigttin  21 :當執行在後狀態時卻需要讀取stdin的資料

#define sigttou  22 :當執行在後狀態時卻需要寫向stdout

#define sigurg  23 :socket的緊急情況

#define sigxcpu  24 :程序超額使用cpu分配的時間

#define sigxfsz  25 :程序使用了超出系統規定檔案長度的檔案

#define si**talrm 26 :內部的alarm時鐘過期

#define sigprof  27 :在乙個程式段中描繪時鐘集過期

#define sigwinch 28 :終端視窗的改變

#define sigio  29 :非同步io

#define sigpoll  sigio :pollable事件發生

21、強制函式返回:return,使用return可以在函式未執行完的情況下,進行返回

22、呼叫函式:call和print都可以進行函式呼叫

23、觀察變數:awatch和watch:awatch在變數或表示式發生改變或讀取都會停止,但是watch只有在值改變時才停止

24、遇斷點後執行特定命令:commands (n):在遇到當前斷點或者第n個斷點時,會執行commands後指定的命令,以end結束,當想清除commands時,直接commands然後輸入end清除

25、清除斷點或自動顯示的表示式:delete n:n為斷點號,也可以用disable和enable阻止斷點或恢復斷點功能,ignore n m則可以設定忽略斷點n m次不執行

26、跳過當前斷點繼續執行:continue(c)num,類似於迴圈語句的continue,有num的情況下,跳過接下來的num處斷點

27、執行下一條或之後n條語句:next(n) n:執行一條語句就不加n,但是不會進入函式內部

28、單步除錯並跟蹤到函式內部:step

29、跳出函式呼叫,並列印函式返回值:finish,還具有在單步除錯時,返回到單步除錯之前進入的函式位置,即可跳過該函式的剩餘部分未執行的**,直接完成剩餘工作,如果在遞迴中,則會回到遞迴的上一層

30、使用until恢復程式執行:until會跳出當前迴圈體,到達迴圈體外的下乙個語句,或者說until是執行程式,直到達到記憶體位址高於當前記憶體位址的指令,而不是更大的行號

31、瀏覽之前的gdb命令:ctrl+p,ctrl +n

32、開啟視窗介面,方便檢視源**:在gdb除錯時候,加上-tui,進入後可以使用info win檢視當前的focus,並用focus(fs)切換視窗,比如fs src:切換到源**視窗,fs cmd:切換到命令視窗

33、檢視當前源程式從哪開始:info line (fun_name)

linux下GDB的使用方法

gdb是gnu開源組織發布的乙個強大的linux下的程式除錯工具。一般來說,gdb主要幫助你完成下面四個方面的功能 1 啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式。2 可讓被除錯的程式在你所指定的調置的斷點處停住。斷點可以是條件表示式 3 當程式被停住時,可以檢查此時你的程式中所發生的...

gdb使用方法

一 程式例子 test.c include int fun int n return sum int main printf d n sum int ret 0 ret fun sum printf d n ret return 0 二 編譯 g表示開啟除錯開關 sudo gcc g test.c ...

gdb使用方法

教程見 編譯程式時需要加上 g,之後才能用gdb進行除錯 gcc g main.c o main gdb中命令 gdb tui a.out 除錯中顯示源 gdb help 檢視命令幫助,具體命令查詢在gdb中輸入help 命令,簡寫h gdb start 單步執行,執行程式,停在第一執行語句 gdb...