Linux之GDB學習

Linux之GDB學習

GDB是一款優秀的調試工具,懂的人天然懂,一直以來用它都沒有好好整理過使用方法,我用的也是皮毛,目前先整理一下皮毛,往後再更新python

使用方法

編譯C++linux

從編譯的角度上來講,須要在編譯的時候加上-g參數,生成調試信息,不然GDB沒法對該程序進行Debug函數

$ gcc -g main.cc工具

啓動GDB學習

$ gdb /your/program便可測試

設置命令行參數命令行

set args 給args變量賦值調試

(gdb) set args -a -b$ gdb /your/program -a -bcode

查看當前的參數使用(gdb) show args事件

python程序的調試也可使用$ gdb python main.py

裝載程序

file FILE 裝載指定的可執行文件進行調試

若是隻是打開了gdb程序沒有初始化裝載程序,能夠經過file命令裝載可執行文件

cd directory 改變當前工做目錄
pwd 顯示當前工做目錄

裝載可執行文件的時候也有工做目錄的說法,能夠經過cd命令切換

瀏覽程序

list linenum 顯示當前源文件的指定行數
list function 顯示當前源文件的指定函數
list filename 顯示指定的源文件
list filename:linenum 顯示指定的源文件的指定行數,函數同理
list 顯示下一個listsize大小的源代碼,能夠經過set/show命令修改大小,默認10行
list - 顯示最後一次list的前面listsize的源代碼

瀏覽源代碼對於定位core dump發生的緣由,定位設斷點的位置都特別有幫助

設置斷點

breakpoints:

break linenum 在當前源文件的指定行數設置斷點
break function 在當前源文件的指定函數設置斷點
break filename:linenum 在指定源文件的指定行數設置斷點,函數同理
break something if condition 條件斷點,符合條件的時候斷點纔會觸發

watchpoints:

watch expr 當應用程序寫expr,修改其值時觸發
rwatch expr 當應用程序讀expr的值時觸發
awatch expr 當應用程序讀取或寫入expr的值時觸發

catchpoints:

catct event 在發生某種事件的時候觸發
tcatch event 同上,但只停一次,生效後自動刪除
事件通常類型爲:throw、catch、exec、fork、load、syscall等

斷點是調試的中間過程的記錄,在循環的地方多使用條件斷點,能夠減小不少的人工操做

斷點管理:

info breakpoint 查看斷點
delete breakpoint num 刪除斷點
disable breakpoint num 禁用斷點
enable breakpoint num 啓用斷點

刪除或禁用一些斷點有利於程序的快速執行,好比一個斷點已經測試幾回都沒運行崩潰,說明這個斷點沒問題,能夠不要了

運行程序

run 運行裝載的可執行程序
step 運行下一行代碼,遇到函數時進入函數
next 運行下一行代碼,遇到函數時運行整個函數
continue 斷點觸發後,繼續執行
call function 調用和執行特定的函數

通常狀況下,我也只使用這些,目前也夠用了,call命令能夠屢次測試一個函數在不一樣參數下的運行狀況

查看變量

print variable 打印一個變量
whatis variable 打印一個變量的類型
ptype variable 打印一個struct或class的定義
backtrace 打印程序中的當前位置和表示如何到達當前位置的棧跟蹤

set variable 能夠修改一個變量的值,但通常狀況下不建議人爲地去修改這些變量的值

backtrace是一個好命令,遇到core dump的時候使用很方便

萬能的命令

help COMMAND 顯示指定命令的幫助信息

縮寫映射表

b -> break
c -> continue
d -> delete
i -> info
l -> list
n -> next
p -> print
r -> run
s -> step
u -> until
bt -> backtrace
aw -> awatch
rw -> rwatch
wa -> watch

初期使用GDB的時候不建議記憶和使用縮寫,後期你天然就會由於懶得寫多兩個字母而天然而然地使用縮寫了

相關文章
相關標籤/搜索