目錄
一、進入除錯的方式
二、單執行緒下的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...