GDB筆記(二):條件斷點、命令列表、監視點Posted by lesca on 2011/05/21 Leave a comment (0) Go to commentshtml 條件斷點break if用法: 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只能用在已存在的斷點上。 條件表達式的返回值上面的條件表達式計算後結果的類型是什麼?答案是int型。 (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函數入口地址的函數指針」,來對參數進行強制類型轉換。調試 爲斷點設置命令列表咱們知道,設置一個斷點而且在上面中斷後,咱們必然會查詢一些變量或者作一些其餘動做。 步驟以下:作用域 用法: (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
定義宏(define)宏能夠在調試期間錄製,也能夠事先錄製在.gdbinit文件中。 define print_and_go print $arg0 continue end 而後在斷點1處定義以下命令: commands 1 silent print_and_go end 監視點(watch)用法: 注意監視點的設定不依賴於斷點的位置,可是與變量的做用域有關,也就是說,要設置監視點必須在程序運行時纔可設置。 在不肯定發生問題的地方時,經過使用監視點的條件表達式,能夠很是方便地找出問題代碼: 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 提示符下按回車健將重複上一個命令。 |