set args 和 show args 指令
set args ../redis.conf(即檔案 redis.conf 位于目前程式 redis-server 的上一層目錄),可以通過 show args 檢視指令行參數是否設定成功。
tbreak指令
tbreak:添加一個斷點
watch 指令
watch:它可以用來監視一個變量或者一段記憶體,當這個變量或者該記憶體處的值發生變化時,GDB 就會中斷下來。被監視的某個變量或者某個記憶體位址會産生一個 watch point(觀察點)。
硬體斷點
display 指令
display 指令監視的變量或者記憶體位址,每次程式中斷下來都會自動輸出這些變量或記憶體的值。
print列印結果顯示完整
set print element 0
GDB 調試的程式接收信号
在 GDB 中使用 signal 函數手動給程式發送信号,這裡就是 signal SIGINT;
改變 GDB 信号處理的設定,通過 handle SIGINT nostop print 告訴 GDB 在接收到 SIGINT 時不要停止,并把該信号傳遞給調試目标程式 。
多線程下禁止線程切換
set scheduler-locking on
set scheduler-locking off
條件斷點
三種斷點:普通斷點、條件斷點和硬體斷點
硬體斷點又叫資料斷點,這樣的斷點其實就是前面課程中介紹的用 watch 指令添加的部分斷點(為什麼是部分而不是全部,前面介紹原因了,watch 添加的斷點有部分是通過軟中斷實作的,不屬于硬體斷點)。硬體斷點的觸發時機是監視的記憶體位址或者變量值發生變化。
普通斷點就是除去條件斷點和硬體斷點以外的斷點
條件斷點,就是滿足某個條件才會觸發的斷點
break [lineNo] if [condition],其中 lineNo 是程式觸發斷點後需要停下的位置,condition 是斷點觸發的條件
void do_something_func(int i)
{
i ++;
i = 100 * i;
}
int main()
{
for(int i = 0; i < 10000; ++i)
{
do_something_func(i);
}
return 0;
}
break 11 if i==5000
添加條件斷點還有一個方法就是先添加一個普通斷點,然後使用“condition 斷點編号斷點觸發條件”這樣的方式來添加
(gdb) b 11
Breakpoint 1 at 0x400514: file test1.c, line 11.
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400514 in main at test1.c:11
(gdb) condition 1 i==5000
(gdb) r
Starting program: /root/testgdb/test1
y
Breakpoint 1, main () at test1.c:11
11 do_something_func(i);
Missing separate debuginfos, use: debuginfo-install glibc-2.17-196.el7_4.2.x86_64
(gdb) p i
$1 = 5000
(gdb)
使用 GDB 調試多程序程式
用 GDB 先調試父程序,等子程序 fork 出來後,使用 gdb attach 到子程序上去,當然這需要重新開啟一個 session 視窗用于調試,gdb attach 的用法在前面已經介紹過了;
GDB 調試器提供了一個選項叫 follow-fork,可以使用 show follow-fork mode 檢視目前值,也可以通過 set follow-fork mode 來設定是當一個程序 fork 出新的子程序時,GDB 是繼續調試父程序還是子程序(取值是 child),預設是父程序( 取值是 parent)