<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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


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

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

    源程序: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 }

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

    使用GDB調(diào)試:

    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)       <-------------------- 直接回車表示,重復(fù)上一次命令
    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    <-------------------- 設(shè)置斷點,在源程序第16行處。
    Breakpoint 1 at 0x8048496: file tst.c, line 16.
    (gdb) break func  <-------------------- 設(shè)置斷點,在函數(shù)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          <--------------------- 單條語句執(zhí)行,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          <--------------------- 繼續(xù)運行程序,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        <--------------------- 查看函數(shù)堆棧。
    #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    <--------------------- 退出函數(shù)。
    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     <--------------------- 繼續(xù)運行。
    Continuing.
    result[1-250] = 31375    <----------程序輸出。

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

    posted on 2008-04-18 15:51 一凡 閱讀(495) 評論(0)  編輯  收藏 所屬分類: Linux C

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产成人精品久久亚洲高清不卡| h视频免费高清在线观看| 在线免费观看国产视频| 精品视频免费在线| 久久精品国产精品亚洲艾| 最近最新MV在线观看免费高清| 亚洲欧美国产国产一区二区三区| ZZIJZZIJ亚洲日本少妇JIZJIZ| 日韩精品无码专区免费播放| 久久精品国产亚洲av天美18| 久久久亚洲精品国产| 在线免费观看一级毛片| 在线观看免费无码专区| 亚洲国产精品无码中文lv| 久久精品亚洲综合| 国产一级一片免费播放i| 1区2区3区产品乱码免费| 高h视频在线免费观看| 亚洲成人黄色网址| 国产亚洲欧洲Aⅴ综合一区| 99精品全国免费观看视频| 久久国产美女免费观看精品| 亚洲午夜无码久久久久软件| 亚洲AV无码国产丝袜在线观看| 天天拍拍天天爽免费视频 | 亚洲免费观看网站| 成年网在线观看免费观看网址| 亚洲国产av一区二区三区丶| 亚洲精品乱码久久久久久自慰| 四虎成人免费观看在线网址| 91av免费观看| a毛片在线免费观看| 疯狂做受xxxx高潮视频免费| 日韩亚洲不卡在线视频中文字幕在线观看| 综合亚洲伊人午夜网| 亚洲AⅤ永久无码精品AA| 国产精品久久久久久久久免费| 久久久精品免费视频| 九九全国免费视频| 精品一区二区三区无码免费直播| 激情综合亚洲色婷婷五月APP|