Linux開發 GDB除錯及常用命令

2021-09-27 16:38:03 字數 3430 閱讀 5456

目錄小記

gdb除錯命令

多程序常用命令

多執行緒常用命令

linux程式發布流程

反除錯技術

安裝gdb外掛程式gef    gdb7.7以上才能用   且程式編譯時 -g  才能用gdb除錯

git clone ~/gdbplugins

對應啟動命令:

echo "source ~/gdbplugins/peda/peda.py" > ~/.gdbinit

echo "source ~/gdbplugins/gef/gef.py" > ~/.gdbinit

echo "source ~/gdbplugins/gdbinit/gdbinit" > ~/.gdbinit

檢視程序命令  ps -a         檢視特定程序  ps -ef | grep hello          檢視程序目錄   which hello

gdb啟動命令:

本地啟動:gdb  路徑          

本地段錯誤檔案啟動:gdb 路徑 core

ulimit -c  檢視當前檔案控制代碼

sudo ulimit -c unlimited 設定無限大儲存core檔案

attch方式啟動 gdb 路徑 pid       gdb /home/wd/hello 2946

遠端啟動 gdbserver 0.0.0.0:6666 /path/to/file

指定檔案方法  命令 ***.c:***x

1.設定函式引數   set args 100 200 

set env user = hcen 設定環境變數

set step-mode 設定單步跟蹤 取消命令 set step-mode no

set detach-on-fork off  掛起所有程序 父程序和子程序都卡住 反之*** on   放行乙個程序 detach inferiors 《程序編號》

set follow-fork-mode 設定跟隨子程序還是父程序    同類 set follow-fork-mode

2.檢視函式  l /list    顯示位置(函式名 行數等)    例:l main   或者  list main

設定顯示行數 set listsize 20   //上下顯示10行

3.斷點 b/break 斷點位置(行數 函式名) 例: b 18  或者 b sum   或者 b hello.c:18

info breakpoints 檢視當前所有斷點

disable 斷點號   設定該斷點失效

delete 斷點號  刪除該斷點

b 行號 if 條件         條件斷點 例: b 22 if i==90

b * 0x8048361      在某個位址上打斷點

watch 引數       記憶體斷點  當讀取這塊記憶體時斷點 用rwatch 引數 移除

4.執行程式 r/run

5.單步執行 ,有函式進入 s/step

6.單步執行,有函式跳過 next /n

ni  執行下一條指令  彙編指令

7.完成函式呼叫並返回 finish/f

8.執行到函式結束或斷點 continue/c

9.檢視程式呼叫堆疊 backtrace/bt

info frame 棧號   檢視該棧號的棧幀

frame 檢視第多少個棧幀

10.檢視記憶體 examine/x

x/(大小int)(單位b一位元組h兩個位元組w四個位元組g八個位元組)(進製x f字串 d i**。。。)

例:x/20gz 0x.....

vmmap  檢視位址段

401000  開頭的是  **段位址

601000 開頭的是  堆位址

11.反彙編** disassemble

12. 檢視命令info

12.1檢視暫存器 info registers/i r

第乙個引數rdi  第二個引數rsi   第三個引數rdx  第四個引數rcx    r8    r9   其餘引數在棧裡 壓棧暫存器rsp

32位程式 直接壓棧 暫存器esp 從右到左

上乙個函式的返回值儲存在暫存器  rax   中

12.2檢視變數 info locals /i lo       p $rsp 當前執行位址       p $rip  當前執行操作

12.3 檢視程式用到的終端模式 infor terminal

重定向輸出    out>fileout

指寫輸入輸出的終端裝置 tty   例 tty /dev/tty0

12.4 檢視當前所有程序   info inferiors      進入乙個程序  inferiors

13.列印資訊 print/p 例:p reselt  或者p/s reselt (字串列印) p/d reselt(十進位制列印)   p/i reselt(**列印)

檢視陣列中的十個元素          p *a@10

14.立即跳出迴圈 until/u

15.指定符號表 symbol-file hello.symbol

16.設定程式執行路徑  path

show paths  檢視程式執行路徑

set follow-fork-mode parent/chile       設定接下來進入子程序還是父程序

set detach-on-fork on/off                    接下來建立的建立的子程序和當前父程序全部卡住

info inferiors                                        檢視所有程序資訊

detach inferiors 編號                          釋放乙個程序的卡住

thread thread-編號                             切換到某個執行緒

info threads                                         檢視所有執行緒

set printf thread-events                       設定執行緒是否列印資訊

set scheduler-locking  off/on/step       除當前執行緒:off不阻止所有執行緒 on所有執行緒鎖定 step 同步除錯

1.檢視檔案是否存在符號表:   readelf -s/-s hello.gcc

2.剝離符號表操作:                 objcopy --only-keep-debug hello.gcc hello.debug

2.生成release程式操作:         objcopy --strip-debug hello.gcc hello.release  //可通過(strip hello.release)再次剝離

3.gdb除錯

加殼 / 加花  (upx壓縮殼 很low)

模糊頭方法

GDB 多文件除錯設定及常用除錯命令

1.多文件除錯設定 以前用gdb除錯都只是除錯單個的檔案,在做dhcp二級relay的時候需要對整個工程進行gdb除錯,發現自己竟然不會!現在終於惡補上了,發到部落格上與大家分享。載入可執行檔案進行gdb除錯。gdb demo 在main函式中斷點位置設定在分包函式這 b dhcrelay.c 36...

GDB常用除錯命令

呼叫gdb編譯需要在cc後面加 g引數再加 o root redhat home gdb 除錯檔案 啟動gdb gdb l 字母l 從第一行開始列出原始碼 gdb break n 在第n行處設定斷點 gdb break func 在函式func 的入口處設定斷點 gdb info break 檢視斷...

gdb常用除錯命令

將.c檔案程式設計成包含標準除錯資訊的檔案 命令 gcc g c o 1 啟動gdb除錯程式 兩種方式 a gdb filename b 啟動gdb後,使用file filename 2 list l 檢視程式 方便設定斷點 3 break b 函式名 在某函式入口處新增斷點 4 break 行號 ...