程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> GDB調試技巧

GDB調試技巧

編輯:C++入門知識

談到GDB,不能不對他的強大功能所折服,在我所用過的所有調試器中,這實在是一個強大的調試工具,今天就說說GDB的簡單用法。GDB是GNU開源組織發布的一個強大的UNIX下的程序調試工具。或許,各位比較喜歡那種圖形界面方式的,像VC、BCB等IDE的調試,但如果你是在 UNIX平台下做軟件,你會發現GDB這個調試工具有比VC、BCB的圖形化調試器更強大的功能。 GDB常用命令: awatch 指定一個變量,如果這個變量被讀或者被寫,則暫停程序運行,在調試器中顯示信息,並等待下一個調試命令。參考rwatch和watch命令。 backtrace 顯示函數調用得所有棧框架(stack frames)的 蹤跡和當前函數的參數的值,bt是這個命令的簡寫。 break 設置一個斷點,這個命令需要指定代碼行或者函數名作為參數 clear 刪除一個斷點,這個命令需要制定代碼行或者函數名作為參數 continue 調試器停止的地方繼續執行 Ctrl-C 在當前位置停止執行正在執行的程序,斷點在當前行 disable 禁止斷點功能,這個命令需要禁止的斷點在斷點列表索引值作為參數 display 在斷點的停止的地方,顯示指定的表達式的值。(顯示變量) enable 允許斷點功能,這個命令需要允許的斷點在斷點列表索引值作為參數 finish 繼續執行,知道當前函數返回 ignore 忽略某個斷點制定的次數。例:ignore 4 23忽略斷點4的23次運行,在第24次的時候中斷 info breakpoints 查看斷點信息 info display 查看設置的需要顯示的表達式的信息 kill 終止當前debug的進程 list 顯示10行代碼。如果沒有提供參數給這個命令,則從當前行開始顯示10行代碼。如果提供了函數名作為參數,則從函數開頭顯示。如果提供代碼行的編號作為參數,這一行作為開頭顯示。 load 動態載入一個可執行文件到調試器。 next 執行下一行的源代碼的所有指令。如果是函數調用,則也當作一行源代碼,執行到此函數返回 nexti 執行下一行的源代碼中的一條匯編指令 print 顯示變量的值 ptype 顯示變量的類型 return 強制從當前函數返回 run 從程序開始的地方執行 rwatch 指定一個變量,如果這個變量被讀,則暫停程序運行,在調試器中顯示信息,並等待下一個調試命令。參考rwatch和watch命令。 set 設置變量的值。例如:set nval=54將把54保存到nval變量中 step 繼續執行程序下一行源代碼的所有指令。如果是調用函數,這個命令將進入函數的內部,單步執行函數中代碼。 stepi 繼續執行程序下一行源代碼中的匯編指令。如果是函數調用,這個命令將進入函數的內部,單步執行函數中的匯編代碼。 txbreak 在當前函數的退出的點上設置一個臨時的斷點(只可使用一次)。 undisplay 刪除一個display設置的變量顯示。這個命令需要將display list中的索引做參數。 watch 指定一個變量,如果這個變量被寫,則暫停程序運行,在調試器中顯示信息,並等待下一個調試命令。參考rwatch和watch命令。 whatis 顯示變量的值和類型。 xbreak 在當前函數的退出的點上設置一個斷點。 還有其他的一些命令可以用“info gdb”和“gdb -help”查看    調試方式: 參考IBM的一段異常代碼進行了測試,具體如下 [cpp]   #include <stdio.h>      int wib(int no1, int no2)   {       int result, diff;       diff = no1-no2;       result = no1/diff;       return result;   }   int main(int argc, char *argv[])   {       int value, div, result, i, total;       value = 10;       div = 6;       total = 0;              for(i=0; i<10; i++)       {           result = wib(value, div);           total += result;           div++;           value--;       }       printf("%d wibed by %d equals %d\n", value, div, total);       return 0;   }     第一步:編譯 編譯的時候注意加-g選項,指定編譯器有調試信息   執行命令:gcc gdb_test.c -o gdb_test -g -Wall 第二部:載入 用GDB把可執行文件載入  執行命令:gdb gdb_test 第三步:設置斷點 查看源碼編號,猜測出錯位置或者全速運行報錯位置設置斷點 執行命令:break  第四步:運行 執行命令:run 第五步:單步調試  單步運行step/next進行調試並打印print  執行命令:run/print 下面是調試過程: [cpp]   [root@localhost gdb]# gdb gdb_test2    //加載   GNU gdb Fedora (6.8-27.el5)   Copyright (C) 2008 Free Software Foundation, Inc.   License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>   This is free software: you are free to change and redistribute it.   There is NO WARRANTY, to the extent permitted by law.  Type "show copying"   and "show warranty" for details.   This GDB was configured as "i386-redhat-linux-gnu"...   (gdb)       (gdb) list 5                           //查看   1       #include <stdio.h>   2   3       int wib(int no1, int no2)   4       {   5               int result, diff;   6               diff = no1-no2;   7               result = no1/diff;   8               return result;   9       }   10      int main(int argc, char *argv[])   (gdb)      (gdb)    (gdb) list   11      {   12              int value, div, result, i, total;   13              value = 10;   14              div = 6;   15              total = 0;   16   17              for(i=0; i<10; i++)   18              {   19                      result = wib(value, div);   20                      total += result;   (gdb)    21                      div++;   22                      value--;   23              }   24              printf("%d wibed by %d equals %d\n", value, div, total);   25              return 0;   26      }   (gdb)          (gdb) break 19                              //設置斷點   Breakpoint 1 at 0x80483d7: file gdb_test2.c, line 19.   (gdb) run                                   //運行   Starting program: /mnt/hgfs/E/Work_Code/Interview/gdb/gdb_test2       Breakpoint 1, main () at gdb_test2.c:19   19                      result = wib(value, div);   (gdb)       (gdb) print div                            //打印值   $5 = 6   (gdb) print value   $6 = 10      (gdb) print value   $15 = 9   (gdb) print div   $16 = 7   (gdb) next                                 //單步調試   20                      total += result;   (gdb) next   21                      div++;   (gdb) next   22                      value--;   (gdb) next   17              for(i=0; i<10; i++)   (gdb) print div   $17 = 8   (gdb) print value   $18 = 8     根據結果可以得出此時div 和value值均為8傳入函數後diff=no1-no2=0,被除數為0,所以導致錯誤。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved