1. 程式人生 > >GDB除錯精粹及使用例項

GDB除錯精粹及使用例項

轉自:http://fanqiang.chinaunix.net/program/other/2006-07-12/4825.shtml

一:列檔案清單
1. 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為變數名)
whatis 命令可以顯示某個變數的型別
(gdb) whatis p
type = int *

print 是gdb的一個功能很強的命令,利用它可以顯示被除錯的語言中任何有效的表示式。表示式除了包含你程式中的變數外,還可以包含以下內容:
l 對程式中函式的呼叫
(gdb) print find_entry(1,0)
l 資料結構和其他複雜物件
(gdb) print *table_start
$8={e=reference=’/000’,location=0x0,next=0x0}
l 值的歷史成分
(gdb)print $1 ($1為歷史記錄變數,在以後可以直接引用 $1 的值)
l 人為陣列
人為陣列提供了一種去顯示儲存器塊(陣列節或動態分配的儲存區)內容的方法。早期的除錯程式沒有很好的方法將任意的指標換成一個數組。就像對待引數一樣,讓我們檢視記憶體中在變數h後面的10個整數,一個動態陣列的語法如下所示:
[email protected]

因此,要想顯示在h後面的10個元素,可以使用[email protected]
(gdb)print [email protected]
$13=(-1,345,23,-234,0,0,0,98,345,10)

四:斷點(breakpoint)
break命令(可以簡寫為b)可以用來在除錯的程式中設定斷點,該命令有如下四種形式:
l break line-number 使程式恰好在執行給定行之前停止。
l break function-name 使程式恰好在進入指定的函式之前停止。
l break line-or-function if condition 如果condition(條件)是真,程式到達指定行或函式時停止。
l 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
(gdb)
2.刪除指定的某個斷點:
(gdb) delete breakpoint 1
該命令將會刪除編號為1的斷點,如果不帶編號引數,將刪除所有的斷點
(gdb) delete breakpoint
3.禁止使用某個斷點
(gdb) disable breakpoint 1
該命令將禁止斷點 1,同時斷點資訊的 (Enb)域將變為 n
4.允許使用某個斷點
(gdb) enable breakpoint 1
該命令將允許斷點 1,同時斷點資訊的 (Enb)域將變為 y
5.清除原檔案中某一程式碼行上的所有斷點
(gdb)clean number
注:number 為原檔案的某個程式碼行的行號

六.變數的檢查和賦值
l whatis:識別陣列或變數的型別
l ptype:比whatis的功能更強,他可以提供一個結構的定義
l set variable:將值賦予變數
l print 除了顯示一個變數的值外,還可以用來賦值

七.單步執行
l next
不進入的單步執行
l step
進入的單步執行
如果已經進入了某函式,而想退出該函式返回到它的呼叫函式中,可使用命令finish

八.函式的呼叫
l call name 呼叫和執行一個函式
(gdb) call gen_and_sork( 1234,1,0 )
(gdb) call printf(“abcd”)
$1=4
l finish 結束執行當前函式,顯示其返回值(如果有的話)

九.機器語言工具
有一組專用的gdb變數可以用來檢查和修改計算機的通用暫存器,gdb提供了目前每一臺計算機中實際使用的4個暫存器的標準名字:
l $pc : 程式計數器
l $fp : 幀指標(當前堆疊幀)
l $sp : 棧指標
l $ps : 處理器狀態

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

Handle命令可控制訊號的處理,他有兩個引數,一個是訊號名,另一個是接受到訊號時該作什麼。幾種可能的引數是:
l nostop 接收到訊號時,不要將它傳送給程式,也不要停止程式。
l stop 接受到訊號時停止程式的執行,從而允許程式除錯;顯示一條表示已接受到訊號的訊息(禁止使用訊息除外)
l print 接受到訊號時顯示一條訊息
l noprint 接受到訊號時不要顯示訊息(而且隱含著不停止程式執行)
l pass 將訊號傳送給程式,從而允許你的程式去處理它、停止執行或採取別的動作。
l nopass 停止程式執行,但不要將訊號傳送給程式。
例如,假定你截獲SIGPIPE訊號,以防止正在除錯的程式接受到該訊號,而且只要該訊號一到達,就要求該程式停止,並通知你。要完成這一任務,可利用如下命令:
(gdb) handle SIGPIPE stop print
請注意,UNIX的訊號名總是採用大寫字母!你可以用訊號編號替代訊號名
如果你的程式要執行任何訊號處理操作,就需要能夠測試其訊號處理程式,為此,就需要一種能將訊號傳送給程式的簡便方法,這就是signal命令的任務。該命令的引數是一個數字或者一個名字,如SIGINT。假定你的程式已將一個專用的SIGINT(鍵盤輸入,或CTRL-C;訊號2)訊號處理程式設定成採取某個清理動作,要想測試該訊號處理程式,你可以設定一個斷點並使用如下命令:
(gdb) signal 2
continuing with signal SIGINT(2)
該程式繼續執行,但是立即傳輸該訊號,而且處理程式開始執行.

十一. 原檔案的搜尋
search text:該命令可顯示在當前檔案中包含text串的下一行。
Reverse-search text:該命令可以顯示包含text 的前一行。

十二.UNIX介面
shell 命令可啟動UNIX外殼,CTRL-D退出外殼,返回到 gdb.

十三.命令的歷史
為了允許使用歷史命令,可使用 set history expansion on 命令
(gdb) set history expansion on

小結:常用的gdb命令
backtrace 顯示程式中的當前位置和表示如何到達當前位置的棧跟蹤(同義詞:where)
breakpoint 在程式中設定一個斷點
cd 改變當前工作目錄
clear 刪除剛才停止處的斷點
commands 命中斷點時,列出將要執行的命令
continue 從斷點開始繼續執行
delete 刪除一個斷點或監測點;也可與其他命令一起使用
display 程式停止時顯示變數和表達時
down 下移棧幀,使得另一個函式成為當前函式
frame 選擇下一條continue命令的幀
info 顯示與該程式有關的各種資訊
jump 在源程式中的另一點開始執行
kill 異常終止在gdb 控制下執行的程式
list 列出相應於正在執行的程式的原檔案內容
next 執行下一個源程式行,從而執行其整體中的一個函式
print 顯示變數或表示式的值
pwd 顯示當前工作目錄
pype 顯示一個數據結構(如一個結構或C++類)的內容
quit 退出gdb
reverse-search 在原始檔中反向搜尋正規表示式
run 執行該程式
search 在原始檔中搜索正規表示式
set variable 給變數賦值
signal 將一個訊號傳送到正在執行的程序
step 執行下一個源程式行,必要時進入下一個函式
undisplay display命令的反命令,不要顯示錶達式
until 結束當前迴圈
up 上移棧幀,使另一函式成為當前函式
watch 在程式中設定一個監測點(即資料斷點)
whatis 顯示變數或函式型別
****************************************************
 GNU的偵錯程式稱為gdb,該程式是一個互動式工具,工作在字元模式。在 X Window 系統中,有一個gdb的前端圖形工具,稱為xxgdb。gdb 是功能強大的除錯程式,可完成如下的除錯任務:
  * 設定斷點;
  * 監視程式變數的值;
  * 程式的單步執行;
  * 修改變數的值。
  在可以使用 gdb 除錯程式之前,必須使用 -g 選項編譯原始檔。可在 makefile 中如下定義 CFLAGS 變數:
   CFLAGS = -g
   執行 gdb 除錯程式時通常使用如下的命令:
   gdb progname

  在 gdb 提示符處鍵入help,將列出命令的分類,主要的分類有:
  * aliases:命令別名
  * breakpoints:斷點定義;
  * data:資料檢視;
  * files:指定並檢視檔案;
  * internals:維護命令;
  * running:程式執行;
  * stack:呼叫棧檢視;
  * statu:狀態檢視;
  * tracepoints:跟蹤程式執行。
  鍵入 help 後跟命令的分類名,可獲得該類命令的詳細清單。


gdb 的常用命令
命令 解釋
  break NUM 在指定的行上設定斷點。
  bt 顯示所有的呼叫棧幀。該命令可用來顯示函式的呼叫順序。
  clear 刪除設定在特定原始檔、特定行上的斷點。其用法為clear FILENAME:NUM
  continue 繼續執行正在除錯的程式。該命令用在程式由於處理訊號或斷點而 導致停止執行時。
  display EXPR 每次程式停止後顯示錶達式的值。表示式由程式定義的變數組成。
  file FILE 裝載指定的可執行檔案進行除錯。
  help NAME 顯示指定命令的幫助資訊。
  info break 顯示當前斷點清單,包括到達斷點處的次數等。
  info files 顯示被除錯檔案的詳細資訊。
  info func 顯示所有的函式名稱。
  info local 顯示當函式中的區域性變數資訊。
  info prog 顯示被除錯程式的執行狀態。
  info var 顯示所有的全域性和靜態變數名稱。
  kill 終止正被除錯的程式。
  list 顯示原始碼段。
  make 在不退出 gdb 的情況下執行 make 工具。
  next 在不單步執行進入其他函式的情況下,向前執行一行原始碼。
  print EXPR 顯示錶達式 EXPR 的值。

******gdb 使用範例************************
-----------------
清單 一個有錯誤的 C 源程式 bugging.c
程式碼:

-----------------
1 #i nclude
2
3 static char buff [256];
4 static char* string;
5 int main ()
6 {
7   printf ("Please input a string: ");
8   gets (string);  
9   printf ("/nYour string is: %s/n", string);
10 }


-----------------
  上面這個程式非常簡單,其目的是接受使用者的輸入,然後將使用者的輸入打印出來。該程式使用了一個未經過初始化的字串地址 string,因此,編譯並執行之後,將出現 Segment Fault 錯誤:
$ gcc -o bugging -g bugging.c
$ ./bugging
Please input a string: asfd
Segmentation fault (core dumped)
為了查詢該程式中出現的問題,我們利用 gdb,並按如下的步驟進行:
1.執行 gdb bugging 命令,裝入 bugging 可執行檔案;
2.執行裝入的 bugging 命令 run;
3.使用 where 命令檢視程式出錯的地方;
4.利用 list 命令檢視呼叫 gets 函式附近的程式碼;
5.唯一能夠導致 gets 函數出錯的因素就是變數 string。用print命令檢視 string 的值;
6.在 gdb 中,我們可以直接修改變數的值,只要將 string 取一個合法的指標值就可以了,為此,我們在第8行處設定斷點 break 8;
7.程式重新執行到第 8行處停止,這時,我們可以用 set variable 命令修改 string 的取值;
8.然後繼續執行,將看到正確的程式執行結果。
(http://www.fanqiang.com)

相關推薦

GDB除錯精粹使用例項(轉載)

一:列檔案清單 1. List (gdb) list line1,line2 二:執行程式 要想執行準備除錯的程式,可使用run命令,在它後面可以跟隨發給該程式的任何引數,包括標準輸入和標準輸出說明符(<和>)和外殼萬用字元(*、?、[、])在內。 如果你使用不帶引數的run命令,gdb就再次使

【工具】GDB除錯精粹使用例項

一:列檔案清單  1. List  (gdb) list line1,line2  二:執行程式  要想執行準備除錯的程式,可使用run命令,在它後面可以跟隨發給該程式的任何引數,包括標準輸入和標準輸出說明符(<和>)和外殼萬用字元(*、?、[、])在內。  如果你使用不帶引數的run命令,gdb

GDB除錯精粹使用例項(轉)

一:列檔案清單 1. List (gdb) list line1,line2 二:執行程式 要想執行準備除錯的程式,可使用run命令,在它後面可以跟隨發給該程式的任何引數,包括標準輸入和標準輸出說明符(<和>)和外殼萬用字元(*、?、[、])在內。 如果你使用不帶引數的run命令,gdb就再次使用

【轉】GDB除錯精粹使用例項

一:列檔案清單 1. List (gdb) list line1,line2 二:執行程式 要想執行準備除錯的程式,可使用run命令,在它後面可以跟隨發給該程式的任何引數,包括標準輸入和標準輸出說明符(<和>)和外殼萬用字元(*、?、[、])在內。 如果你使用不帶引數的run命令,gdb就再次使用

GDB除錯精粹使用例項

轉自:http://fanqiang.chinaunix.net/program/other/2006-07-12/4825.shtml一:列檔案清單1. List(gdb) list line1,line2二:執行程式要想執行準備除錯的程式,可使用run命令,在它後面可以跟

GDB除錯總結和例項

1)啟動gdb gdb hello 或者 gdb file hello 2)顯示程式 list 或者 l 3)打斷點 break(b) main() //函式的入口處 break(b) 11 //行號 break(b) hello.c:14 //

gdb除錯命令程式崩潰時的核心轉存core dump

1.gcc -g filename.c -o filename 需要生成帶除錯資訊的檔案 2.除錯   方式一:gdb filename 除錯file可執行檔案   方式二:>>gdb              >>file filename $gd

GDB除錯精粹

一、列檔案清單 list / l 列出產生執行檔案的原始碼的一部分 //列出 line1 到 line2 行之間的原始碼 (gdb) list line1, line2 //輸出從上次呼叫list命令開始往後的10行程式程式碼 (gdb) list //輸出第 n 行附

linux應用程式設計筆記(1)gdb除錯方法如何找出dbg.c程式中的錯誤

摘要: 介紹了gdb偵錯程式以及其使用流程,總結了常用的幾個gdb除錯命令,最後使用這些方法找出dgb.c檔案中的錯誤。 一、gdb簡介     gdb是gnu釋出的一款功能強大的程式除錯工具,其主

linux下使用gdb除錯崩潰丶死鎖例項

gdb是linux下一款功能強大的除錯工具,windows下對應的有windbg,下面舉例說明常見程式錯誤解決方法 1.gdb啟動 要想使用gdb除錯,編譯時指定-g選項加入除錯資訊,gdb可以啟動執

GDB除錯Android程式碼——環境搭建除錯過程

[email protected]:~/java/adt-bundle-linux-x86_64-20140321/android-ndk-r10b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin$ adb forward

qemu建立虛擬機器,gdb除錯網路配置

準備:  安裝映象iso,qemu source code,安裝編譯qemu必要的庫 準備,主要參考openwrt交叉開發環境,加上常用的軟體 sudo apt-get updatesudo apt-get install gcc g++ gfortran gdb vim

GDB常用的除錯命令方法總結

1. 執行GDB啟動 GDB 的方法有以下幾種:gdb <program>:program 是使用者的執行檔案,一般在當然目錄下。    例如:gdb bmu_run gdb

vim gdb 除錯gcc優化

基本的除錯命令 就不說了。 今天收穫了。 gdb 使用while列印陣列 set $i=0 while $i<10 p shuzu[$i] set $i++ end gcc優化 原來經常遇到的-O是優化執行時間的。 自己試了試 -O0 比-O3慢了3倍速度大概,當然

gdb除錯gdbserver遠端除錯

     gdb偵錯程式是一款GNU開發組織併發布的UNIX/Linux下的程式除錯工具,具有強大的功能,足有與Visual Stido媲美,當然友好的介面是沒法相比的,呵呵。      開始編譯程式將除錯資訊包含進去,gdb偵錯程式執行在shell中輸入gdb就好,也可以輸

Linux程式設計——gdb除錯

    上一篇文章中,我們學習了gcc編譯器的使用。本文,我們就講解 gdb 偵錯程式(Debug)的使用,它可以幫助我們找出程式之中的錯誤和漏洞等等。     當程式編譯完成後,它可能無法正常執行;或許程式會徹底崩潰;或許只是不能

android ANR、traces檔案獲取例項分析

前言:前段時間專案開發中遇到anr的問題,時間緊急,一時間又難以定位,通過臨時方法解決後,最近有時間對ANR的問題做一次份細的解決方案,本文中的解決方案是通過綜合其他部落格後自己再通過例項驗證後得出的可行方案,讀者如遇類似問題可做參考,歡迎評論交流。

Java RMI特性例項程式碼

RMI (Remote Method Invocation) 1,RMI 採用stubs 和 skeletons 來進行遠端物件(remote object)的通訊。stub 充當遠端物件的客戶端代理,有著和遠端物件相同的遠端介面,遠端物件的呼叫實際是通過呼叫該物件的客戶端代理物件stub來

使用gdb除錯死鎖執行緒

1.除錯檔案 lock.c   #include <stdio.h> #include <pthread.h> #include <unistd.h> void *work_thread(void *arg) { pthread_mutex_

觀察者模式(訂閱釋出模式)例項Demo

1、觀察者模式,又稱訂閱釋出模式,其架構如下: 2、例項demo——訂閱天氣,釋出天氣 1>WeatherSubject  目標類 public class WeatherSubject {      priv