一、打開GDB
1、gdb filename
加載該文件到gdb
2、gdb
file filename
如果gdb filename失敗,可以在打開gdb以後,通過file來加載調試文件
3、gdb -tui
file filename
帶畫面的調試
如果顯示上圖的信息說明,沒有指定文件,或者沒有調試信息。
*注意-g,在linux下用gcc編譯時,如果不加-g,編譯器會進行優化,就不會生成調試信息,無法調試,也可以使用-ggdb,這是gcc爲gdb提供的更詳細的調試信息,別的調試器無法使用。
二、常見命令
l(list):顯示代碼,list 行號:將顯示當前文件以“行號”爲中心的前後10行代碼,如:list 12,list 函數名:將顯示“函數名”所在函數的源代碼,如:list main;
b(break):設置斷點,參數可以是行數,函數名,也可以用文件名:行數或者文件名:函數名;
tb(tbreak):臨時斷點,參數和b的一樣;
info b(i b/info break):查看斷點,查看斷點;
例:如下圖,通過b設置斷點,如果要爲斷點指定源文件,使用b helloworld.c:10(源文件名:行數或者函數名),列Num的數字123是斷點序號,Disp爲keep的表示爲普通斷點,爲del的則爲臨時斷點,Enb是斷點是否有效,y爲有效,無效爲n
clear n:清除第n行的斷點;
d (delete) n:刪除第n個斷點;
disable n:暫停第n個斷點;
enable n:開啓第n個斷點;
例:下圖是刪除斷點和暫停開始和清楚的示例
r (run):執行程序;
s(step):有函數時,進入函數函數體,沒有時,單步執行;
n (next):單步執行,不進入函數體;
c (continue):遇到斷點以後,程序會阻塞,輸入c可以讓程序繼續執行;
p (print):打印表達式,表達式可以是變量,也可以是操作,也可以是函數調用 print 1,print a+1 print f(a);
until:可以運行程序直到退出循環體;
finish:運行程序,直到當前函數完成返回,並打印函數返回時的堆棧地址和返回值及參數值等信息;
watch:設置一個監視點,一旦被監視的“表達式”的值改變,gdb將強行終止正在被調試的程序;
frame n:移動到指定的棧幀,並打印棧的信息,n爲幀編號,如果不指定n,打印當前棧的信息;
set args 參數:指定運行時的參數;
show args:查看設置好的參數;
show paths:查看程序運行路徑;set environment varname [=value] 設置環境變量。show environment [varname] 查看環境變量;
cd 相當於shell的cd;
pwd :顯示當前所在目錄;
info program: 來查看程序的是否在運行,進程號,被暫停的原因;
bt(backtrace):查看堆棧信息,因爲棧是後進先出,所以要從下往上看,最下面的是最先執行的函數;
threads:查看所有線程信息;
shell XXX:執行shell命令行,XXX爲shell命令,如shell ls就執行shell裏的ls命令;
thread n:切換線程,參數爲線程號,可以通過threads查看,一般常用的是通過threads查看線程序號,通過thread n切換過去,再用bt查看線程棧的信息;
condition:給斷點設置觸發條件,比如b 10 if a > b與b 10然後condition 1 if a> b等價(假設b 10的斷點號爲1),取消斷點條件用condition 斷點號;
ignore:特殊斷點條件,程序只有到達該斷點指定次數以後纔會觸發,ignore 1 10,忽略斷點號爲1的斷點10次以後才觸發;
kill:將強行終止當前正在調試的程序;
help 命令:help 命令將顯示“命令”的常用幫助信息;
call 函數(參數):調用“函數”,並傳遞“參數”,如:call gdb_test(55);
layout:用於分割窗口,可以一邊查看代碼,一邊測試;
layout src:顯示源代碼窗口;
layout asm:顯示反彙編窗口;
layout regs:顯示源代碼/反彙編和CPU寄存器窗口;
layout split:顯示源代碼和反彙編窗口;
display: 在每次單步進行指令後,緊接着輸出被設置的表達式及值;
stepi或nexti:單步跟蹤一些機器指令;
Ctrl + L:刷新窗口;
quit:簡記爲 q ,退出gdb;
回車:重複上一條命令;
執行下一步操作,注意命令行此時顯示的並不是當前執行的操作,而是下一次要執行的。