GDB使用詳解

一、打開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;

回車:重複上一條命令;

執行下一步操作,注意命令行此時顯示的並不是當前執行的操作,而是下一次要執行的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章