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

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

一:列檔案清單
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.然後繼續執行,將看到正確的程式執行結果。

相關推薦

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命令,在它後面可以跟

linux驅動current,引用當前進程,task_struct

結束運行 可執行文件 頁面 window contex round save () 喚醒 盡管內核模塊不象應用程序一樣順序執行, 內核做的大部分動作是代表一個特定進程的. 內核代碼可以引用當前進程, 通過存取全局項 current, 它在 <asm/current.h

PostgreSQL CPU滿(100%)性能分析優化

mark ike -- 過多 mar 是不是 影響 sas sql日誌 PostgreSQL CPU滿(100%)性能分析及優化 轉自:https://help.aliyun.com/knowledge_detail/43562.html 在數據庫運維當中,

Linux c —— opendir函數和readdir函數內涵用法

har code pan 接下來 () cat AD con size_t opendir函數 頭文件:#include <sys/types.h> #include <dirent.h> 函數:DIR *opendir(const char *n

windows下安裝cygwin配置

data gdb lan cal trac art rfi .html type reference:https://cygwin.com/install.html 對於使用Windows操作系統作為開發平臺同時又喜歡類unix環境的朋友(Windows不是最方便的開發

Tsi721訊號處理

reference: https://blog.csdn.net/shanghaiqianlun/article/details/50545581 1.      PCIe訊號

linux核心GPIO模擬I2C例項

前言: 在許多情況下,我們並沒有足夠的I2C匯流排,本文主在介紹如何利用Linux核心中的i2c-gpio模組,利用2條GPIO線模擬i2c匯流排,並掛載裝置。 思路: 先通過對i2c-gpio所定義的結構體初始化(包括初始化i2c的2條線,頻率

[place recognition]NetVLAD: CNN architecture for weakly supervised place recognition 論文翻譯解析

https://blog.csdn.net/qq_32417287/article/details/80102466 abstract introduction method overview Dee

常見web漏洞防範

單個漏洞,需要進行排查與整改,藉著別人的智慧,做一個簡單的收集。最好能夠將常見漏洞,不限於web類的,進行一個統一的整理。這是今年的任務。 進行漏洞的工具的收集,為未來的工作做好基礎。。。 一、SQL注入漏洞 SQL注入攻擊(SQL Injection)

Java記憶體資料庫-H2介紹例項SpringBoot

介紹 記憶體資料庫(Embedded database或in-momery database)具有配置簡單、啟動速度快、尤其是其可測試性等優點,使其成為開發過程中非常有用的輕量級資料庫。在spring中支援HSQL、H2和Derby三種資料庫。 總的感覺H2很厲害的樣子,既然是這樣的話,我們先介紹H2

申請付費蘋果開發者賬號 注意事項流程

一、基礎知識 蘋果開發者賬號分為 個人(individual),公司(company),企業(enterprise)三種類型。個人賬號只能有一個開發者,公司賬號允許多個開發者協作開發,企業賬號其App只能用於內部員工使用,是無法對外公開的。所以,通常情況下大家都是選擇個

使用getInstance()方法的原因作用

public static DBConnect instance; public static DBConnect getInstance(){ if(instance == null){ instance = new DBconnect();

OpenStack部署應用第五篇:建立一個例項

  這部分建立必須的虛擬網路來支援建立多個例項。網路選項1包含一個使用公共虛擬網路(外部網路)的例項。網路選項2包含一個使用公共虛擬網路的例項、一個使用私有虛擬網路(私有網路)的例項。 1、建立虛擬網路 根據你在網路選項中的選擇來建立虛擬網路。如果你選擇選項1,只需建立一個公有網路。如果你選擇選項2,同時建

奇異值分解(SVD)原理詳解推導

很不錯的文章,適合入門。     在網上看到有很多文章介紹SVD的,講的也都不錯,但是感覺還是有需要補充的,特別是關於矩陣和對映之間的對應關係。前段時間看了國外的一篇文章,叫A Singularly Valuable Decomposition The SVD of

monkeyrunner之環境搭建例項

    Monkeyrunner工具提供了一個API,使用此API寫出的程式可以在Android程式碼之外控制Android裝置和模擬器。 一、Monkeyrunner簡介 1.MOnkeyrunner相對Monkey區別 1)Monkeyrunner工具在工作站上通過API定義的特定命令和事件控制裝置

js實現輪播圖原理示例

網上有很多的例子介紹,在這裡我所做的**無縫滾動**就是 通過改變元素的left值讓圖片呈現左右滾動的效果。 我們首先看一下 div+css 的結構樣式: div+css程式碼 <!DOCTYPE html> <html> <