Gdb調試

Gdb調試命令

  1. gdb filename:run開始、quit結束
  2. gdb attach pid:程序已經運行後,可使用attach跟蹤進程,attach目標進程後,調試器會暫停下來,需要continue才繼續,停止調試後使用detach命令分離調試器,quit結束
  3. gdb filename corename:默認不開啓core,需要設置core文件大小,使用ulimit -a可查看core文件大小,使用ulimit -c [n]設置core文件最大n字節,使用ulimit -c unlimited表示修改爲不限制大小。

常用命令

run®: 運行一個程序
start: 執行程序,停在main函數處
continue©: 讓暫停的程序繼續執行,continue默認遇到斷點時候會暫停執行,可以使用continue n表示繼續執行一定次數
next(n): 運行到下一行
step(s): 進入到調用函數內部
until(u): 運行到指定行停下來
finish(fi): 結束當前調用函數,到上一層函數調用處
return: 結束當前調用函數並返回指定值到上一層函數調用處
finish命令會執行函數到正常退出函數,return會立即結束當前函數並返回
jump(j): 執行流跳轉到指定行或地址
print§: 打印變量或寄存器值,也可以修改變量或寄存器值,默認顯示有最大長度,設置set print element 0可設置將打印結果顯示完整
backtrace(bt): 當前線程調用堆棧
bt n:顯示棧頂的n個幀信息
bt -n: 顯示棧底的n個幀信息
bt full: 顯示棧中所有幀的所有信息:函數參數、本地變量等
frame(f): 切換到調用線程的制定堆棧
thread id: 切換到指定線程
break(b): 添加斷點
tbradk: 添加臨時斷點(temporary)
rbreak [regex]在滿足正則表達式的函數處添加斷點
條件斷點1:break [linenumber] if [condition]
條件斷點2: 先break [linenumber]再condition [linenumber] [condition]
delete(del): 刪除斷點
enable: 啓用某個斷點
disable: 禁用某個斷點
enable once [num]:斷點只啓用一次
捕獲: catch和tcatch表示捕獲xxx停止程序運行
catch syscall close 產生close系統調用後停止程序運行
display: 每次程序中斷下來都會自動輸出變量的值
delete display
info display
delete display id
watch: 監視某一變量或內存地址值是否發生變化,當變化時gdb就會停下
watch [expr/field]:發生變化時暫停執行
awatch [expr/field]:被訪問或者發生變化時暫停執行
rwatch [expr/field]:被訪問時暫停執行
watch expr thread [threadid]:監視某個線程的變量表達式
list(l): 顯示源碼
list + 向後看源碼
list - 向前看源碼
默認只顯示10行代碼,可以查看行數show listsize
可以設置行數set listsize [num]
list [first],[last]
list [function]
list [filename:function]
info: 查看斷點線程等信息
ptype: 查看變量類型
whatis field 打印出field的結構定義
ptype field 更詳細的打印field的類型
set variable [field]=[expression]改變變量的值
set $r0=[value] 改變寄存器的值
disassemble(dis): 查看彙編代碼
show disassembly-flavor:顯示反彙編指令格式
set disassembly-flavor intel 設置反彙編格式爲intel格式
set args: 設置程序啓動命令行參數
show args: 查看設置的命令行參數
info break:查看斷點信息
info thread:查看線程信息
info sharedlibrary:顯示加載的動態鏈接庫信息
LWP:Light Weight Process輕量級進程
signal SIGSEGV: 可以使用signal SIGSEGV手動給程序發送信號
handle SIGSEGV 使用handle表示gdb調試時忽略某個信號
show scheduler-locking:顯示當前線程scheduler-locking狀態
set scheduler-locking on調試時將程序執行流鎖定在當前線程,禁止上下文切換
set scheduler-locking off:不鎖定任何線程,所有線程都執行
set scheduler-locking step: 阻止其它線程在當前線程單步調試時搶佔當前線程,當next、continue、until、finish等其它線程纔會執行
checkpoint搭配restart [id]: 相當於給在當前進程檢查點加一個快照,適合調試難以復現的bug,預感將要發生bug前,添加個checkpoint
多線程調試
thread id 多線程時,默認是主線程,這裏可以切換當前調試的線程爲指定id的線程號
thread apply all [cmd] 所有線程執行命令
thread apply 1 2 3 [cmd] 1 2 3線程執行命令
thread apply 1 2 3 bt: 查看1 2 3線程堆棧信息

tui調試

tui調試是gdb自帶的功能,ctrl+X+A可以開啓TUI模式,開啓TUI模式後默認會有兩個窗口,上窗口是當前執行位置的代碼,下窗口是gdb環境

cgdb

cgdb是一個更高級的調試工具,和gdb使用方式完全相同,默認就會開啓tui功能查看代碼

gdb調試原理

gdb調試原理是使用ptrace系統調用

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