隨筆-204  評論-90  文章-8  trackbacks-0
          Linux 包含了一個叫 gdb 的 GNU 調試程序. gdb 是一個用來調試 C 和 C++ 程序的強力調試器. 它使你能在程序運行時觀察程序的內部結構和內存的使用情況. 以下是 gdb 所提供的一些功能:
          1、啟動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。
          2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)
          3、當程序被停住時,可以檢查此時你的程序中所發生的事。
          4、動態的改變你程序的執行環境。
          當你啟動 gdb 后, 你能在命令行上指定很多的選項. 可以以下面的方式來運行 gdb gdb <fname>
          當你用這種方式運行 gdb , 你能直接指定想要調試的程序. 這將告訴gdb 裝入名為 fname 的可執行文件. 你也可以用 gdb 去檢查一個因程序異常終止而產生的 core 文件, 或者與一個正在運行的程序相連. 你可以參考 gdb 指南頁或在命令行上鍵入 gdb -h 得到一個有關這些選項的說明的簡單列表.  
          為調試編譯代碼
          為了使 gdb 正常工作, 你必須使你的程序在編譯時包含調試信息. 調試信息包含你程序里的每個變量的類型和在可執行文件里的地址映射以及源代碼的行號.  gdb 利用這些信息使源代碼和機器碼相關聯.
          在編譯時用 -g 選項打開調試選項.


          命   令 描  述
          file 裝入想要調試的可執行文件.
          kill 終止正在調試的程序.
          list 列出產生執行文件的源代碼的一部分.
          next 執行一行源代碼但不進入函數內部.
          step 執行一行源代碼而且進入函數內部.
          run 執行當前被調試的程序
          quit 終止 gdb
          watch 使你能監視一個變量的值而不管它何時被改變.
          break 在代碼里設置斷點, 這將使程序執行到這里時被掛起.
          make 使你能不退出 gdb 就可以重新產生可執行文件.
          shell 使你能不離開 gdb 就執行 UNIX shell 命令. 

          (a)設置斷點
          break 20;---在第20行設置斷點
          break func;---在函數func的入口處設置斷點
          (b)取消斷點
          delete break 20;---取消第20行的斷點
          delete break func;---取消函數func入口處的斷點
          (c)運行代碼
          run;
          r;
          (d)顯示變量或函數值
          display;
          p;
          (e)單步執行
          next;
          n;
          (f)跳步執行
          step;
          s;
          (g)循環執行
          continue;
          c;
          (h)列出運行棧內容
          bt;
          一個調試示例
          ——————

          源程序:tst.c

               1 #include <stdio.h>
               2
               3 int func(int n)
               4 {
               5         int sum=0,i;
               6         for(i=0; i<n; i++)
               7         {
               8                 sum+=i;
               9         }
              10         return sum;
              11 }
              12
              13
              14 main()
              15 {
              16         int i;
              17         long result = 0;
              18         for(i=1; i<=100; i++)
              19         {
              20                 result += i;
              21         }
              22
              23        printf("result[1-100] = %d \n", result );
              24        printf("result[1-250] = %d \n", func(250) );
              25 }

          編譯生成執行文件:(Linux下)
          cc -g tst.c -o tst

          使用GDB調試:

          gdb tst  <---------- 啟動GDB
          GNU gdb 5.1.1
          Copyright 2002 Free Software Foundation, Inc.
          GDB is free software, covered by the GNU General Public License, and you are
          welcome to change it and/or distribute copies of it under certain conditions.
          Type "show copying" to see the conditions.
          There is absolutely no warranty for GDB.  Type "show warranty" for details.
          This GDB was configured as "i386-SuSE-linux"...
          (gdb) l     <-------------------- l命令相當于list,從第一行開始例出原碼。
          1        #include <stdio.h>
          2
          3        int func(int n)
          4        {
          5                int sum=0,i;
          6                for(i=0; i<n; i++)
          7                {
          8                        sum+=i;
          9                }
          10               return sum;
          (gdb)       <-------------------- 直接回車表示,重復上一次命令
          11       }
          12
          13
          14       main()
          15       {
          16               int i;
          17               long result = 0;
          18               for(i=1; i<=100; i++)
          19               {
          20                       result += i;   
          (gdb) break 16    <-------------------- 設置斷點,在源程序第16行處。
          Breakpoint 1 at 0x8048496: file tst.c, line 16.
          (gdb) break func  <-------------------- 設置斷點,在函數func()入口處。
          Breakpoint 2 at 0x8048456: file tst.c, line 5.
          (gdb) info break  <-------------------- 查看斷點信息。
          Num Type           Disp Enb Address    What
          1   breakpoint     keep y   0x08048496 in main at tst.c:16
          2   breakpoint     keep y   0x08048456 in func at tst.c:5
          (gdb) r           <--------------------- 運行程序,run命令簡寫
          Starting program: /home/hchen/test/tst

          Breakpoint 1, main () at tst.c:17    <---------- 在斷點處停住。
          17               long result = 0;
          (gdb) n          <--------------------- 單條語句執行,next命令簡寫。
          18               for(i=1; i<=100; i++)
          (gdb) n
          20                       result += i;
          (gdb) n
          18               for(i=1; i<=100; i++)
          (gdb) n
          20                       result += i;
          (gdb) c          <--------------------- 繼續運行程序,continue命令簡寫。
          Continuing.
          result[1-100] = 5050       <----------程序輸出。

          Breakpoint 2, func (n=250) at tst.c:5
          5                int sum=0,i;
          (gdb) n
          6                for(i=1; i<=n; i++)
          (gdb) p i        <--------------------- 打印變量i的值,print命令簡寫。
          $1 = 134513808
          (gdb) n
          8                        sum+=i;
          (gdb) n
          6                for(i=1; i<=n; i++)
          (gdb) p sum
          $2 = 1
          (gdb) n
          8                        sum+=i;
          (gdb) p i
          $3 = 2
          (gdb) n
          6                for(i=1; i<=n; i++)
          (gdb) p sum
          $4 = 3
          (gdb) bt        <--------------------- 查看函數堆棧。
          #0  func (n=250) at tst.c:5
          #1  0x080484e4 in main () at tst.c:24
          #2  0x400409ed in __libc_start_main () from /lib/libc.so.6
          (gdb) finish    <--------------------- 退出函數。
          Run till exit from #0  func (n=250) at tst.c:5
          0x080484e4 in main () at tst.c:24
          24              printf("result[1-250] = %d \n", func(250) );
          Value returned is $6 = 31375
          (gdb) c     <--------------------- 繼續運行。
          Continuing.
          result[1-250] = 31375    <----------程序輸出。

          Program exited with code 027. <--------程序退出,調試結束。
          (gdb) q     <--------------------- 退出gdb。

          posted on 2008-04-18 15:51 一凡 閱讀(498) 評論(0)  編輯  收藏 所屬分類: Linux C
          主站蜘蛛池模板: 甘泉县| 浦江县| 独山县| 鹤壁市| 屏边| 翁牛特旗| 中方县| 临沧市| 凤翔县| 荆门市| 任丘市| 廊坊市| 西昌市| 珠海市| 邯郸市| 德庆县| 绥芬河市| 云南省| 桦川县| 浦县| 本溪市| 永安市| 昌宁县| 花莲县| 讷河市| 漳平市| 盐边县| 拉萨市| 白水县| 德钦县| 和静县| 旬阳县| 本溪| 察雅县| 壤塘县| 新田县| 磐安县| 长白| 绥江县| 枣庄市| 五常市|