天天看點

GDB常用指令(1)

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)
           

繼續閱讀