青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

chaosuper85

C++博客 首頁 新隨筆 聯系 聚合 管理
  118 Posts :: 0 Stories :: 3 Comments :: 0 Trackbacks

簡述

    一 列文件清單
    二:執行程序
    三:顯示數據
    四:斷點(breakpoint)
    五.斷點的管理
    六.變量的檢查和賦值
    七. 單步執行
    八.函數的調用
    九.機器語言工具
    十.信號

GDB的使用方法

簡述
一 列文件清單

    * List

      (gdb) list line1,line2

二:執行程序
要想運行準備調試的程序,可使用run命令,在它后面可以跟隨發給該程序的任何參數,包括標準輸入和標準輸出說明符(<和> )和外殼通配符(*、?、[、])在內。如果你使用不帶參數的run命令,gdb就再次使用你給予前一條run命令的參數,這是很有用的。利用set args 命令就可以修改發送給程序的參數,而使用show args 命令就可以查看其缺省參數的列表。

(gdb)set args –b –x
(gdb) show args
backtrace命令為堆棧提供向后跟蹤功能。
Backtrace 命令產生一張列表,包含著從最近的過程開始的所以有效過程和調用這些過程的參數。

三:顯示數據

    * 利用print 命令可以檢查各個變量的值。

      (gdb) print p (p為變量名)

      print 是gdb的一個功能很強的命令,利用它可以顯示被調試的語言中任何有效的表達式。表達式除了包含你程序中的變量外,還可以包含以下內容:

   1. 對程序中函數的調用

      (gdb) print find_entry(1,0)

   2. 數據結構和其他復雜對象

      (gdb) print *table_start
      $8={e=reference=’\000’,location=0x0,next=0x0}

   3. 值的歷史成分

      (gdb)print $1 ($1為歷史記錄變量,在以后可以直接引用 $1 的值)

   4. 人為數組
      人為數組提供了一種去顯示存儲器塊(數組節或動態分配的存儲區)內容的方法。早期的調試程序沒有很好的方法將任意的指針換成一個數組。就像對待參數一樣,讓我們查看內存中在變量h后面的10個整數,一個動態數組的語法如下所示:
      base@length
      因此,要想顯示在h后面的10個元素,可以使用h@10

      (gdb)print h@10
      $13=(-1,345,23,-234,0,0,0,98,345,10)

    * whatis 命令可以顯示某個變量的類型

      (gdb) whatis p
      type = int *

四:斷點(breakpoint)
break命令(可以簡寫為b)可以用來在調試的程序中設置斷點,該命令有如下四種形式:

    * break line-number 使程序恰好在執行給定行之前停止。
    * break function-name 使程序恰好在進入指定的函數之前停止。
    * break line-or-function if condition 如果condition(條件)是真,程序到達指定行或函數時停止。
    * break routine-name 在指定例程的入口處設置斷點

如果該程序是由很多原文件構成的,你可以在各個原文件中設置斷點,而不是在當前的原文件中設置斷點,其方法如下:

(gdb) break filename:line-number
(gdb) break filename:function-name

要想設置一個條件斷點,可以利用break if命令,如下所示:

(gdb) break line-or-function if expr
例:
(gdb) break 46 if testsize==100

從斷點繼續運行:countinue 命令
五.斷點的管理

1.顯示當前gdb的斷點信息:

(gdb) info break

他會以如下的形式顯示所有的斷點信息:

Num Type Disp Enb Address What
1 breakpoint keep y 0x000028bc in init_random at qsort2.c:155
2 breakpoint keep y 0x0000291c in init_organ at qsort2.c:168

   1. 刪除指定的某個斷點:

      (gdb) delete breakpoint 1

      該命令將會刪除編號為1的斷點,如果不帶編號參數,將刪除所有的斷點

      (gdb) delete breakpoint

   2. 禁止使用某個斷點

      (gdb) disable breakpoint 1

      該命令將禁止斷點 1,同時斷點信息的 (Enb)域將變為 n
   3. 允許使用某個斷點

      (gdb) enable breakpoint 1

      該命令將允許斷點 1,同時斷點信息的 (Enb)域將變為 y
   4. 清除原文件中某一代碼行上的所有斷點

      (gdb)clean number

      注:number 為原文件的某個代碼行的行號

六.變量的檢查和賦值

    * whatis:識別數組或變量的類型
    * ptype:比whatis的功能更強,他可以提供一個結構的定義
    * set variable:將值賦予變量
    * print 除了顯示一個變量的值外,還可以用來賦值

七. 單步執行

    * next 不進入的單步執行
    * step 進入的單步執行如果已經進入了某函數,而想退出該函數返回到它的調用函數中,可使用命令finish

八.函數的調用

    * call name 調用和執行一個函數

      (gdb) call gen_and_sork( 1234,1,0 )
      (gdb) call printf(“abcd”)
      $1=4

    * finish 結束執行當前函數,顯示其返回值(如果有的話)

九.機器語言工具
有一組專用的gdb變量可以用來檢查和修改計算機的通用寄存器,gdb提供了目前每一臺計算機中實際使用的4個寄存器的標準名字:

    * $pc : 程序計數器
    * $fp : 幀指針(當前堆棧幀)
    * $sp : 棧指針
    * $ps : 處理器狀態

十.信號
gdb 通常可以捕捉到發送給它的大多數信號,通過捕捉信號,它就可決定對于正在運行的進程要做些什么工作。例如,按CTRL-C將中斷信號發送給gdb,通常就會終止gdb。但是你或許不想中斷gdb,真正的目的是要中斷gdb正在運行的程序,因此,gdb要抓住該信號并停止它正在運行的程序,這樣就可以執行某些調試操作。

Handle命令可控制信號的處理,他有兩個參數,一個是信號名,另一個是接受到信號時該作什么。幾種可能的參數是:

    * nostop 接收到信號時,不要將它發送給程序,也不要停止程序。
    * stop 接受到信號時停止程序的執行,從而允許程序調試;顯示一條表示已接受到信號的消息(禁止使用消息除外)
    * print 接受到信號時顯示一條消息
    * noprint 接受到信號時不要顯示消息(而且隱含著不停止程序運行)
    * pass 將信號發送給程序,從而允許你的程序去處理它、停止運行或采取別的動作。
    * nopass 停止程序運行,但不要將信號發送給程序。

例如,假定你截獲SIGPIPE信號,以防止正在調試的程序接受到該信號,而且只要該信號一到達,就要求該程序停止,并通知你。要完成這一任務,可利用如下命令:

(gdb) handle SIGPIPE stop print

請注意,UNIX的信號名總是采用大寫字母!你可以用信號編號替代信號名如果你的程序要執行任何信號處理操作,就需要能夠測試其信號處理程序,為此,就需要一種能將信號發送給程序的簡便方法,這就是signal命令的任務。該命令的參數是一個數字或者一個名字,如SIGINT。假定你的程序已將一個專用的 SIGINT(鍵盤輸入,或CTRL-C;信號2)信號處理程序設置成采取某個清理動作,要想測試該信號處理程序,你可以設置一個斷點并使用如下命令:

(gdb) signal 2
continuing with signal SIGINT(2)

該程序繼續執行,但是立即傳輸該信號,而且處理程序開始運行.
GDB的使用方法

GDB是一個強大的命令行調試工具。大家知道命令行的強大就是在于,其可以形成
執行序列,形成腳本。UNIX下的軟件全是命令行的,這給程序開發提代供了極大的
便利,命令行軟件的優勢在于,它們可以非常容易的集成在一起,使用幾個簡單的已
有工具的命令,就可以做出一個非常強大的功能。

于是UNIX下的軟件比Windows下的軟件更能有機地結合,各自發揮各自的長處,組合
成更為強勁的功能。而Windows下的圖形軟件基本上是各自為營,互相不能調用,很
不利于各種軟件的相互集成。在這里并不是要和Windows做個什么比較,所謂“寸有
所長,尺有所短”,圖形化工具還是有不如命令行的地方。

 

用GDB調試程序

GDB概述
————

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

所謂“寸有所
長,尺有所短”就是這個道理。

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

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

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

一個調試示例
——————

源程序:tst.c

1 #include
2
3 int func(int n)
4 {
5 int sum=0,i;
6 for(i=0; 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下)
hchen/test> cc -g tst.c -o tst

使用GDB調試:

hchen/test> 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
2
3 int func(int n)
4 {
5 int sum=0,i;
6 for(i=0; 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。
hchen/test>

好了,有了以上的感性認識,還是讓我們來系統地認識一下gdb吧。

使用GDB
————

一般來說GDB主要調試的是C/C++的程序。要調試C/C++的程序,首先在編譯時,我們
必須要把調試信息加到可執行文件中。使用編譯器(cc/gcc/g++)的 -g 參數可以
做到這一點。如:

> cc -g hello.c -o hello
> g++ -g hello.cpp -o hello

如果沒有-g,你將看不見程序的函數名、變量名,所代替的全是運行時的內存地址。
當你用-g把調試信息加入之后,并成功編譯目標代碼以后,讓我們來看看如何用
gdb來調試他。

啟動GDB的方法有以下幾種:

1、gdb
program也就是你的執行文件,一般在當然目錄下。

2、gdb core
用gdb同時調試一個運行程序和core文件,core是程序非法執行后core dump后產生的文件。

3、gdb

如果你的程序是一個服務程序,那么你可以指定這個服務程序運行時的進程ID。
gdb會自動attach上去,并調試他。program應該在PATH環境變量中搜索得到。

GDB啟動時,可以加上一些GDB的啟動開關,詳細的開關可以用gdb -help查看。我在下面只例舉一些比較常用的參數:

-symbols
-s
從指定文件中讀取符號表。

-se file
從指定文件中讀取符號表信息,并把他用在可執行文件中。

-core
-c
調試時core dump的core文件。

-directory
-d
加入一個源文件的搜索路徑。默認搜索路徑是環境變量中PATH所定義的路徑。

GDB的命令概貌
———————

啟動gdb后,就你被帶入gdb的調試環境中,就可以使用gdb的命令開始調試程序了,gdb的命令可以使用help命令來查看,如下所示:

/home/hchen> 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) help
List of classes of commands:

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

Type "help" followed by a class name for a list of commands in that class.
Type "help" followed by command name for full documentation.
Command name abbreviations are allowed if unambiguous.
(gdb)

gdb的命令很多,gdb把之分成許多個種類。help命令只是例出gdb的命令種類,如果
要看種類中的命令,可以使用help 命令,如:help breakpoints,查看設置斷點的所
有命令。也可以直接help 來查看命令的幫助。


gdb中,輸入命令時,可以不用打全命令,只用打命令的前幾個字符就可以了,當然,
命令的前幾個字符應該要標志著一個唯一的命令,在Linux下,你可以敲擊兩次TAB
鍵來補齊命令的全稱,如果有重復的,那么gdb會把其例出來。

示例一:在進入函數func時,設置一個斷點。可以敲入break func,

 

posted on 2009-08-04 08:38 chaosuper 閱讀(298) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲经典在线看| 亚洲免费在线观看视频| 欧美三区在线视频| 好看的日韩视频| 日韩一级黄色av| 欧美成人精品在线| 亚洲欧美国产日韩天堂区| 猛男gaygay欧美视频| 国产一区二区三区久久悠悠色av| 亚洲男人第一av网站| 亚洲欧洲一区二区三区| 久久阴道视频| 亚洲高清成人| 久久在线观看视频| 久久亚洲欧洲| 伊人久久噜噜噜躁狠狠躁| 久久亚洲一区二区三区四区| 一区二区三区四区五区视频| 欧美揉bbbbb揉bbbbb| 亚洲激情啪啪| 亚洲日本欧美| 欧美精品福利视频| 一区二区三区视频免费在线观看| 亚洲国产精品999| 欧美精品999| 9色精品在线| 亚洲乱码国产乱码精品精天堂| 欧美激情偷拍| 9人人澡人人爽人人精品| 99热这里只有成人精品国产| 国产精品国产自产拍高清av| 新狼窝色av性久久久久久| 亚洲一区二区三区四区五区黄| 国产精品久久久久久久久搜平片| 亚洲欧美日韩在线观看a三区| 亚洲小说欧美另类婷婷| 国产自产2019最新不卡| 国产精品日韩电影| 狠狠色综合色区| 久久中文字幕导航| 蜜桃精品一区二区三区| 亚洲欧洲一区二区三区| 亚洲欧洲日本mm| 欧美日韩一区二区在线播放| 亚洲欧美中文字幕| 欧美中文在线观看国产| 亚洲日本在线观看| 99精品国产热久久91蜜凸| 国产精品国产三级欧美二区| 久久久精品性| 欧美久久久久久| 亚洲一区二区三区成人在线视频精品 | 玖玖在线精品| 亚洲一区视频在线| 久久久亚洲一区| 亚洲午夜精品视频| 亚洲免费伊人电影在线观看av| 亚洲电影成人| 亚洲一级黄色| 亚洲第一中文字幕在线观看| 9人人澡人人爽人人精品| 国产亚洲福利| 亚洲日本欧美日韩高观看| 国产伦精品一区二区三区照片91 | 久久精品91久久香蕉加勒比 | 亚洲国产成人午夜在线一区 | 久热精品视频在线观看| 欧美日韩精品久久久| 久久天堂av综合合色| 欧美日韩在线观看视频| 久久综合伊人77777尤物| 欧美日韩免费观看中文| 久久另类ts人妖一区二区| 欧美日韩国产色站一区二区三区| 久久久久99| 欧美日韩直播| 亚洲高清在线精品| 国产欧美一区二区三区在线老狼 | 欧美一区二区久久久| 一区二区精品| 欧美高清视频在线| 欧美1区2区| 国产麻豆午夜三级精品| avtt综合网| 一本大道久久a久久精二百| 久久精品亚洲乱码伦伦中文| 亚洲欧美文学| 欧美精选一区| 亚洲风情在线资源站| 国内精品久久久久影院色| 亚洲午夜91| 亚洲视频播放| 欧美激情一区二区三区全黄| 极品日韩av| 麻豆成人在线| 国产亚洲精品高潮| 亚洲午夜精品一区二区| 亚洲三级视频| 毛片一区二区三区| 免费成人黄色片| 狠狠色丁香久久婷婷综合丁香| 亚洲一级片在线看| 亚洲欧美日韩国产另类专区| 欧美日韩一区国产| 99re热精品| 亚洲天堂av电影| 欧美日韩在线一区| 亚洲淫性视频| 欧美亚洲三级| 国产婷婷色一区二区三区四区| 午夜亚洲精品| 久久日韩粉嫩一区二区三区| 黑人巨大精品欧美一区二区| 久久国产婷婷国产香蕉| 老司机精品久久| 在线观看一区| 免费成人网www| 亚洲国产婷婷| 亚洲视频网在线直播| 日韩午夜av电影| 午夜精品久久久久| 国产欧美日韩一区二区三区在线观看 | 亚洲永久精品国产| 欧美一级视频一区二区| 国产一区成人| 久久久人成影片一区二区三区| 欧美激情亚洲激情| 一本一本久久a久久精品综合麻豆| 欧美精品免费播放| 亚洲天堂av综合网| 卡通动漫国产精品| 亚洲毛片网站| 国产日本欧美视频| 另类人畜视频在线| 一本色道久久综合狠狠躁的推荐| 亚洲欧美日韩国产一区二区三区| 国产欧美另类| 久久综合九色综合久99| 亚洲精品综合精品自拍| 亚洲午夜伦理| 在线欧美日韩| 欧美四级剧情无删版影片| 午夜一区不卡| 亚洲国产欧美日韩精品| 先锋影音一区二区三区| 极品尤物久久久av免费看| 欧美图区在线视频| 午夜在线视频一区二区区别| 欧美成人国产va精品日本一级| 一本大道久久精品懂色aⅴ| 国产日韩欧美二区| 欧美激情视频一区二区三区在线播放 | 国产精品美女一区二区| 久久一区二区三区超碰国产精品 | 国产精品午夜av在线| 噜噜噜91成人网| 亚洲一区二区三区在线| 蜜桃久久av一区| 亚洲一区二区三区高清| 亚洲人成网站精品片在线观看 | 米奇777超碰欧美日韩亚洲| 亚洲欧美日韩精品久久| 亚洲激情一区二区三区| 国产精品久久福利| 久久免费一区| 久久xxxx精品视频| 夜夜爽99久久国产综合精品女不卡| 久久亚洲综合| 欧美一级一区| 亚洲无线一线二线三线区别av| 亚洲国产经典视频| 国内精品视频在线观看| 国产精品久久久久一区二区三区| 欧美电影免费观看高清| 久久久九九九九| 午夜日本精品| 午夜精品久久久久久久久久久| 99精品国产在热久久| 亚洲精品久久久久中文字幕欢迎你| 裸体丰满少妇做受久久99精品| 欧美在线日韩精品| 亚洲在线电影| 亚洲一区二区三区色| 中文国产成人精品久久一| 一区二区精品| 亚洲午夜影视影院在线观看| 99国产一区二区三精品乱码| 一本色道久久88综合亚洲精品ⅰ| 亚洲人成久久| 亚洲国产精品一区二区三区| 欧美激情影院| 亚洲激情影院| 亚洲免费观看高清完整版在线观看熊 | 国产精品你懂的| 国产精品久久久久9999| 欧美性做爰毛片| 欧美午夜视频在线观看| 欧美丰满少妇xxxbbb| 欧美日韩免费高清| 国产精品美女午夜av|