GDB筆記(二):條件斷點、命令列表、監視...

GDB筆記(二):條件斷點、命令列表、監視點

Posted by lesca on 2011/05/21 Leave a comment (0) Go to commentshtml

條件斷點

break if

用法:
break [break-args] if (condition)
例如:shell

break main if argc > 1
break 180 if (string == NULL && i < 0)
break test.c:34 if (x & y) == 1
break myfunc if i % (j + 3) != 0
break 44 if strlen(mystring) == 0

 

condition

與break if相似,只是condition只能用在已存在的斷點上。
用法:
condition <break_list> (condition)
例如:
cond 3 i == 3
將會在斷點3上附加條件(i == 3)函數

條件表達式的返回值

上面的條件表達式計算後結果的類型是什麼?答案是int型。
這是由於惟一能在斷點條件表達式中使用的返回值類型爲int
這意味着,若是調用了像cos()這樣的數學函數,會致使預料以外的值。
如(在已經鏈接到libm庫的前提下):spa

(gdb) print cos(0.0)
$1 = -1073776640

解決這個問題的方法是類型轉換,咱們來看這個例子指針

(gdb) set $p = (double (*) (double)) cos
(gdb) print cos(0.0)
$2 = -1073776640
(gdb) print $p(0.0)
$3 = 1

在這裏,經過設置變量$p爲「一個參數爲double,返回類型爲double的指向cos函數入口地址的函數指針」,來對參數進行強制類型轉換調試

爲斷點設置命令列表

咱們知道,設置一個斷點而且在上面中斷後,咱們必然會查詢一些變量或者作一些其餘動做。
若是這些動做能夠一鼓作氣,豈不妙哉!使用命令列表(commands)就能實現這個功能。htm

步驟以下:作用域

用法:
commands break_list
例如:get

(gdb) commands 1
Type commands for when breakpoint 1 is hit, one per line.
End with a line saying just "end".
>silent 
>printf "n = %d \n", n
>continue
>end
  1. 創建斷點
  2. 使用commands命令

定義宏(define)

宏能夠在調試期間錄製,也能夠事先錄製在.gdbinit文件中。
GDB的宏就像shell腳本同樣,能夠傳入參數,依次是$arg0, $arg1, …
定義好宏以後,能夠用在命令列表中。
注意,宏並不支持全部的GDB命令,如silent就不能用在宏中。
以上節爲例,咱們錄製一個宏:數學

define print_and_go
print $arg0
continue
end

而後在斷點1處定義以下命令:

commands 1
silent
print_and_go
end

監視點(watch)

用法:
watch var

注意

監視點的設定不依賴於斷點的位置,可是與變量的做用域有關,也就是說,要設置監視點必須在程序運行時纔可設置。

在不肯定發生問題的地方時,經過使用監視點的條件表達式,能夠很是方便地找出問題代碼:

watch i > 999

一旦i > 999,程序就會被中斷,GDB指出改變條件的代碼。

 

next, continue, step區別:

     next表示跳往當前代碼棧中的下一條指令,若是下一條指令是函數調用,而且函數中存在斷點,則直接跑到該斷點停止。

    continue 表示跳往下一個斷點, next和continue的區別是: 在當前代碼堆棧中,step和next都會一條條的執行,而continue直接跑到下一個斷點去執行去了。 若是當前代碼中調用的是函數棧,則next和continue沒有任何區別【直接跑到斷點處停止】。

     step 和next 在當前代碼棧中類似,都是一條條語句執行,不一樣的是在函數棧調用時,next進入的方式直接跑到斷點處停止(因此叫作"下一個"),step是從函數棧的起始位置停止(因此叫作「單步」)。

 4.  執行run指令,則遇到斷點,就會中止,經過watch + 變量名 查看結果, next執行到下一個斷點, continue下一個斷點,kill結束

 5. 爲加快調試速度,以上命令均可以簡寫爲第一個字母。在 gdb 提示符下按回車健將重複上一個命令。

相關文章
相關標籤/搜索