亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

GDB調試及其調試腳本的使用

2019-11-11 04:28:06
字體:
來源:轉載
供稿:網友

一、GDB調試

1.1. GDB 概述

GDB是GNU開源組織發布的一個強大的UNIX下的程序調試工具。或許,各位比較喜歡那種圖形界面方式的,像VC、BCB等IDE的調試,但如果你是在UNIX/linux平臺下做軟件,你會發現GDB這個調試工具有比VC、BCB的圖形化調試器更強大的功能。所謂“寸有所長,尺有所短”就是這個道理。

一般來說,GDB主要幫忙你完成下面四個方面的功能:

    1、啟動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。    2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)    3、當程序被停住時,可以檢查此時你的程序中所發生的事。    4、動態的改變你程序的執行環境。

從上面看來,GDB和一般的調試工具沒有什么兩樣,基本上也是完成這些功能,不過在細節上,你會發現GDB這個調試工具的強大,大家可能比較習慣了圖形化的調試工具,但有時候,命令行的調試工具卻有著圖形化工具所不能完成的功能。讓我們一一看來。

1.2.GDB 使用示例

使用一個簡單的判斷來測試一下:文件名gdbtest.c

[cpp] view plain copy<span style="font-size:18px">#include "stdio.h"  int main()  {      int x=3;      if(x<4)          PRintf("x is less than 4/n");      else           printf("x is biger than 4/n");  }  </span>  

程序很簡單,設置x=3,然后判斷x是否比4小,若比4小則輸出”x is less than 4“,若比4大,則輸出”x is biger than 4“ ,程序很無聊,但是我們可以用來做GDB的測試!

注: 編譯的時候需要使用-g選項,我使用的是:  gdb -g3 gdbtest.c -o gdbtest

使用GDB調試:

[cpp] view plain copy#gdb gdbtest                                <------- 啟動GDB  GNU gdb (GDB) 7.5-Ubuntu  Copyright (C) 2012 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 "i686-linux-gnu".  For bug reporting instructions, please see:  <http://www.gnu.org/software/gdb/bugs/>...  Reading symbols from /home/long/gdbtest...done.  (gdb) l                                     <------- l命令相當于list,從第一行開始例出原  碼  1   #include "stdio.h"  2   int main()  3   {  4       int x=3;  5       if(x<4)  6           printf("x is less than 4/n");  7       else  8           printf("x is biger than 4/n");  9   }  (gdb) break 5                               <------- 設置斷點,在源程序第5行處。  Breakpoint 1 at 0x8048935: file gdbtest.c, line 5.  (gdb) run                                   <------- 運行程序,也可以用簡寫r  Starting program: /home/long/gdbtest    Breakpoint 1, main () at gdbtest.c:5        <------- 其實停在第一個斷點,在第5行  5       if(x<4)  (gdb) info break                            <------- 查看斷點的信息  Num     Type           Disp Enb Address    What  1       breakpoint     keep y   0x08048935 in main at gdbtest.c:5      breakpoint already hit 1 time  (gdb) print x                               <------- 打印x的值(print 也可以用其簡寫p)>,這時候x等于上面賦值的3  $1 = 3  (gdb) print &x                              <------- 打印x的地址  $2 = (int *) 0xbffff21c  (gdb) x/4x 0xbffff21c                       <------- 查看從0xbffff21c開始的4*4個字節的值  0xbffff21c: 0x00000003  0x0804a000  0x00000000  0x00000000  <------- x為int值,為4個字節  ,所以x的值等于0x00000003,我們可以看到此時x等于3  (gdb) set x=5                               <------- 我們設置x=5  (gdb) print x                               <------- 打印x的值,可以看到x已經被改成5了  $3 = 5  (gdb) x/4x 0xbffff21c  0xbffff21c: 0x00000005  0x0804a000  0x00000000  0x00000000  (gdb) n                                     <------- 單條語句執行,next命令簡寫。  8           printf("x is biger than 4/n");  (gdb) c                                     <------- 繼續運行程序,continue命令簡寫。  Continuing.                                   profiling:/home/zhouyl:Cannot create directory  profiling:/home/zhouyl/NicholClass/error_test/gdb/gdbtest.gcda:Skip  x is biger than 4[Inferior 1 (process 9265) exited with code 01]    <------- 程序輸出x is biger than 4,因為此時x已經被改為5了  (gdb) q                                     <-------  退出gdb  #  

在上述GDB調試測試中,我們可以將x的值改為5,然后程序的輸出變為 x is biger than 4 。很有趣又很強大是不?

1.3.GDB 更多知識點總結(不斷搜集)

1.3.1 GDB 調試如何傳參數?

我們仍然使用示例來演示:

示例的代碼很簡單:test.c

[cpp] view plain copy#include <stdio.h>  int main(int argc, char **argv)  {      int i=0;      i=atoi(argv[1]);      i = i + 1;      printf("The value after add the first arg is : %d/n",i);      i=atoi(argv[2]);      i = i - 1;      printf("The value after minus the second arg is : %d/n",i);      return 0;  }  

示例中我們分別打印第一個參數加1和第二個參數減1 的值。

我們使用gdb調試,在進入調試后 使用set args  111  1的方法設置參數

[cpp] view plain copy#gcc -g3 test.c -o test  #gdb test                                   <------- 正常開始調劑程序  GNU gdb (GDB) 7.5-ubuntu  Copyright (C) 2012 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 "i686-linux-gnu".  For bug reporting instructions, please see:  <http://www.gnu.org/software/gdb/bugs/>...  Reading symbols from /tmp/test...done.  (gdb) set args 111  1                       <------- 在調試時給程序傳入參數  (gdb) run  Starting program: /tmp/test 111  1  The value after add the first arg is : 112  The value after minus the second arg is : 0  [Inferior 1 (process 9667) exited normally]  (gdb) q  #  

或者我們可以使用 gdb  --args  ./test  111  1的方法

[cpp] view plain copygdb --args ./test 111 1  GNU gdb (GDB) 7.5-ubuntu  Copyright (C) 2012 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 "i686-linux-gnu".  For bug reporting instructions, please see:  <http://www.gnu.org/software/gdb/bugs/>...  Reading symbols from /tmp/test...done.  (gdb) run  Starting program: /tmp/test 111 1  The value after add the first arg is : 112  The value after minus the second arg is : 0  [Inferior 1 (process 10784) exited normally]  (gdb) q  

二、GDB調試腳本的使用

下面我們對第一章中的gdbtest.c文件使用gdb腳本調試,其實很簡單我們只要把需要的操作放到一個文件中,比如叫做 gdbtest.sh

[cpp] view plain copybreak 5  run  set x=5  c  q  那么我們如何使用?其實很簡單,我們在使用時,不用直接gdb gdbtest ,而使用  gdb  ./gdbtest  -command=gdbtest.sh

其實還有種方法,我們直接在腳本中添加所要調試的文件信息,此時的  gdbtest.sh內容為:

[cpp] view plain copyfile gdbtest            <----- 制定目標文件為gdbtest  break 5  run  set x=5  c  q  而我們調試使用的命令就簡單了,直接使用gdb -x gdbtest.sh 即可!

三、GCOV的使用

3.1  gcov是什么?

Gcov is GCC Coverage是一個測試代碼覆蓋率的工具是一個命令行方式的控制臺程序伴隨GCC發布,配合GCC共同實現對C/C++文件的語句覆蓋和分支覆蓋測試;與程序概要分析工具(profiling tool,例如gprof)一起工作,可以估計程序中哪一段代碼最耗時;

注:程序概要分析工具是分析代碼性能的工具。

3.2  gcov能做什么?

 gcov可以統計:

每一行代碼的執行頻率實際上哪些代碼確實被執行了每一段代碼(section code)的耗時(執行時間)

因此,gcov可以幫你優化代碼,當然這個優化動作還是應該有開發者完成。

3.3 gcov 使用

我們繼續使用第一章中的gdbtest.c文件,使用gcov時候,在編譯時使用  gcc -g3 -fprofile-arcs -ftest-coverage gdbtest.c

[cpp] view plain copy<span style="font-size:18px">#ls  gdbtest.c  gdbtest.sh  #gcc -g3 -fprofile-arcs -ftest-coverage gdbtest.c       <-------- 使用-fprofile-arcs -ftest-coverage 參數添加gcov信息,其實可以不使用-g參數,我示例中需要使用gdb調試,所以添加了  #./a.out  x is less than 4  #gcov gdbtest  File‘gdbtest.c’  已執行的行數:83.33% (共 6 行)  Creating 'gdbtest.c.gcov'    # cat gdbtest.c.gcov          -:    0:Source:gdbtest.c          -:    0:Graph:gdbtest.gcno          -:    0:Data:gdbtest.gcda          -:    0:Runs:1          -:    0:Programs:1          -:    1:#include "stdio.h"          1:    2:int main()                              <----------- "1"為本行運行次數          -:    3:{          1:    4:    int x=3;          1:    5:    if(x<4)          1:    6:        printf("x is less than 4/n");          -:    7:    else       #####:    8:        printf("x is biger than 4/n");  <-----------"#####"代表此行未運>行            1:    9:}  #         #gdb ./a.out -command=gdbtest.sh                        <-------- 使用上面的腳本調試,其  實我們的目的是運行 else ,然后看區別!  GNU gdb (GDB) 7.5-ubuntu  Copyright (C) 2012 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 "i686-linux-gnu".  For bug reporting instructions, please see:  <http://www.gnu.org/software/gdb/bugs/>...  Reading symbols from /home/long/gcovtest/a.out...done.  Breakpoint 1 at 0x80489dd: file gdbtest.c, line 5.  Breakpoint 1, main () at gdbtest.c:5  5       if(x<4)  x is biger than 4  [Inferior 1 (process 10165) exited with code 01]  #gcov gdbtest                                           <----------- 多運行幾次a.out或者  使用腳本,后想重新看看最新的測試代碼覆蓋率,需要重新 gcov gdbtest  File‘gdbtest.c’   已執行的行數:100.00% (共 6 行)  Creating 'gdbtest.c.gcov'   #cat gdbtest.c.gcov          -:    0:Source:gdbtest.c          -:    0:Graph:gdbtest.gcno          -:    0:Data:gdbtest.gcda          -:    0:Runs:2          -:    0:Programs:1          -:    1:#include "stdio.h"          2:    2:int main()          -:    3:{          2:    4:    int x=3;          2:    5:    if(x<4)          1:    6:        printf("x is less than 4/n");   <----------- 使用腳本運行時,此>行未執行,所以還是運行了1次          -:    7:    else                                <----------- 其實本行else是運行>過一次的,但是gcov 統計時把本行與下一行打印放在一起計時的!          1:    8:        printf("x is biger than 4/n");          2:    9:}  #  </span>  

注: 

【1】陳浩專欄: "用GDB調試工具"

一、 http://blog.csdn.net/haoel/article/details/2879

二、http://blog.csdn.net/haoel/article/details/2880

三、http://blog.csdn.net/haoel/article/details/2881

四、http://blog.csdn.net/haoel/article/details/2882

五、http://blog.csdn.net/haoel/article/details/2883

六、http://blog.csdn.net/haoel/article/details/2884

七、http://blog.csdn.net/haoel/article/details/2885

【2】http://blog.csdn.net/zhujinghao09/article/details/8461543

【3】http://blog.csdn.net/ganggexiongqi/article/details/8846001

【4】http://blog.csdn.net/yukin_xue/article/details/7653482


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品一区二区三区三区| 精品久久久久久亚洲精品| 久久成年人免费电影| 亚洲精品一区二区三区不| 国产精品久久久久久久av电影| 欧美日韩一区二区在线播放| 性金发美女69hd大尺寸| 91精品国产自产在线老师啪| 91久久精品国产91久久性色| 日韩中文有码在线视频| 福利精品视频在线| 亚洲欧美国产日韩天堂区| 精品久久久久久亚洲精品| 精品国产一区av| 国产日韩中文字幕| 91免费福利视频| 欧美有码在线视频| 色吧影院999| 青草青草久热精品视频在线观看| 一区二区欧美激情| 91av在线国产| 全色精品综合影院| 日韩免费观看网站| 亚洲少妇激情视频| 亚洲美女视频网站| 亚洲黄在线观看| 亚洲欧洲第一视频| 久久精品亚洲热| 久久国产精品网站| 韩国日本不卡在线| 久久这里有精品| 91久久久久久久久久久| 国产视频一区在线| 久久av资源网站| 亚洲精品免费一区二区三区| 精品久久久久久久久久久久| 亚洲欧洲在线免费| 亚洲激情视频网站| 成人黄色av播放免费| 国产视频在线观看一区二区| 丝袜情趣国产精品| 色播久久人人爽人人爽人人片视av| 狠狠久久亚洲欧美专区| 欧美日韩国产一区在线| 日韩美女视频中文字幕| 欧美精品18videos性欧美| 欧美在线欧美在线| 国产亚洲一区精品| 97人人做人人爱| 国产精品日日做人人爱| 精品日韩美女的视频高清| 国产一区二区三区三区在线观看| 欧美一级片一区| 精品毛片三在线观看| 国内免费久久久久久久久久久| 亚洲毛片一区二区| 国产精品久久久久久久久久| 国产xxx69麻豆国语对白| 国产精品欧美日韩久久| 日韩在线视频线视频免费网站| 久久久久女教师免费一区| 911国产网站尤物在线观看| 日韩视频免费在线| 欧美性猛交xxxx久久久| 亚洲欧洲日产国产网站| 另类视频在线观看| 色阁综合伊人av| 欧美成人激情图片网| 日韩久久免费视频| 成人av电影天堂| 日本在线观看天堂男亚洲| 国产日韩欧美中文| 57pao国产成人免费| 成人激情黄色网| 91国产精品电影| 九九热视频这里只有精品| 97香蕉超级碰碰久久免费的优势| 色噜噜亚洲精品中文字幕| 欧美日韩国产中字| 91久久在线播放| 黄色成人av在线| 日韩精品视频中文在线观看| 日本精品一区二区三区在线| 国产精品一区专区欧美日韩| 欧美视频中文在线看| 亚洲天堂第二页| 亚洲国产精品人久久电影| 国产一区二区久久精品| 久久99国产综合精品女同| 欧美激情在线观看| 国产999在线观看| 亚洲午夜未满十八勿入免费观看全集| 午夜精品一区二区三区av| 亚洲精品久久久久中文字幕二区| 亚洲国产精品人久久电影| xxxxx91麻豆| 国产91热爆ts人妖在线| 91在线观看免费网站| 亚洲伦理中文字幕| xxx成人少妇69| 中文字幕日韩av综合精品| 成人av在线亚洲| 深夜福利一区二区| 欧美激情免费在线| 日韩欧美有码在线| 久久99青青精品免费观看| 亚洲人精品午夜在线观看| 日本高清不卡在线| 国产精品日韩在线一区| 精品亚洲夜色av98在线观看| 尤物九九久久国产精品的分类| 国产精品视频最多的网站| 欧美高清videos高潮hd| 国产精品视频一区二区高潮| 亚洲精品影视在线观看| 亚洲在线观看视频| 国产伦精品免费视频| 久久综合免费视频| 欧美色视频日本高清在线观看| 爽爽爽爽爽爽爽成人免费观看| 久久久久久有精品国产| 亚洲国产精品悠悠久久琪琪| 中文字幕日韩欧美在线| 日韩在线观看免费高清完整版| 日韩精品中文字幕有码专区| 国产精品久久久久久久久久99| 不卡av电影在线观看| 亚洲成人亚洲激情| 亚洲国模精品一区| 精品亚洲国产成av人片传媒| 亚洲日本aⅴ片在线观看香蕉| 国产精品18久久久久久麻辣| 91视频国产高清| 欧美日本黄视频| 黑人狂躁日本妞一区二区三区| 国产成人久久精品| 96国产粉嫩美女| 久久久精品美女| 性金发美女69hd大尺寸| 亚洲sss综合天堂久久| 亚洲精品欧美一区二区三区| 色狠狠av一区二区三区香蕉蜜桃| 超碰日本道色综合久久综合| 亚洲国模精品一区| 色一情一乱一区二区| 日韩大陆欧美高清视频区| 91干在线观看| 国产在线观看91精品一区| www.久久草.com| 日韩在线中文字幕| 欧美日本国产在线| www.亚洲一区| 日韩av片电影专区| 国产精品自产拍高潮在线观看| 久久综合免费视频影院| 欧美精品久久久久a| 国产成人精品电影| 日韩成人免费视频| 中文字幕亚洲综合久久| 日韩电影网在线| 日韩在线观看免费高清完整版| 久久久久久999| 97在线视频国产| 日韩精品在线看|