【轉】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個整數,一個動態陣列的語法如下所示:
因此,要想顯示在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除錯精粹及使用例項
一:列檔案清單 1. List (gdb) list line1,line2 二:執行程式 要想執行準備除錯的程式,可使用run命令,在它後面可以跟隨發給該程式的任何引數,包括標準輸入和標準輸出說明符(<和>)和外殼萬用字元(*、?、[、])在內。 如果你使用不帶引數的run命令,gdb就再次使用
【工具】GDB除錯精粹及使用例項
一:列檔案清單 1. List (gdb) list line1,line2 二:執行程式 要想執行準備除錯的程式,可使用run命令,在它後面可以跟隨發給該程式的任何引數,包括標準輸入和標準輸出說明符(<和>)和外殼萬用字元(*、?、[、])在內。 如果你使用不帶引數的run命令,gdb
【轉】GDB除錯opencore原始碼
1 首先在終端執行:emulator –show-kernel -memory 1024開啟模擬器2 開啟另一個終端,執行:adb shell進入模擬器shell,3 在模擬器shell中執行 ps mediaserver檢視程序mediaserver的PID4 檢視PID後
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命令,在它後面可以跟
【轉】event.keyCode用法及列表
strong page ets cells 不支持 和數 jump fire 靜音 event.keyCode用法及列表 HTML 用戶名:<input type="text" id="UserAccount" onKeyPress="JumpByEnter(
【轉】Linux安裝HDF5及遇到的問題總結
inf 遇到 upload 詳細步驟 iframe gunzip 總結 comm box Linux安裝HDF5及遇到的問題總結 轉自: http://www.linuxdiyf.com/linux/26164.html ubuntu版
【轉】MySQL使用者管理及SQL語句詳解
【轉】MySQL使用者管理及SQL語句詳解 1.1 MySQL使用者管理 1.1.1 使用者的定義 使用者名稱+主機域 mysql> select user,host,password from mysql.user; +--------+------------+---------
【轉】vscode除錯執行c#詳細操作過程
【轉】vscode除錯執行c#詳細操作過程 主要命令: //路徑跳轉cd //新建專案dotnet new console -o 路徑 //執行dotnet run //用於釋出exe<RuntimeIdentifie
【TOMCAT】記錄除錯錯誤及解決辦法
1.無法啟動tomcat。 原因1: The servlets named ] and ] are both mapped to the url-pattern [/BaseServlet] which is not permitted 這個也會使tomcat報錯, 生成的註解@We
【Linux】GDB除錯多執行緒和多程序以及Core檔案
GDB偵錯程式 基本概念 GDB是GNU開源組織釋出的一個強大的UNIX下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像VC、BCB等IDE的除錯,但如果你是在UNIX平臺下做軟體,你會發現
【轉】JAR檔案包及命令的使用
1. JAR 檔案包 JAR 檔案就是 Java Archive File,顧名思意,它的應用是與 Java 息息相關的,是 Java 的一種文件格式。JAR 檔案非常類似 ZIP 檔案——準確的說,它就是
【轉】英語動詞的“及物”和“不及物”,為什麽不好懂?
分享圖片 功能 wdm page smp 例如 圖片 res bsp 關於英語中的實義動詞,按照能不能直接跟賓語的標準,可以分為兩類---及物動詞和不及物動詞兩大類,很多學生在聽到老師說“及物”、“不及物”的時候,就會蒙圈,原
【轉】gcc/g++常用編譯選項和gdb常用除錯命令
gcc/g++編譯器是我們寫編譯C/C++程式時離不開的編譯工具,而gdb又是除錯C/C++程式的利器,這一篇文章我們記錄一下它們的慣常用法。 gcc/g++常用編譯選項 選項 作
【轉】哈希(Hash)與加密(Encrypt)的基本原理、區別及工程應用
phy 理論 靈活運用 十分 實際應用 廣泛 tle 多網站 net 0、摘要 今天看到吉日嘎拉的一篇關於管理軟件中信息加密和安全的文章,感覺非常有實際意義。文中作者從實踐經驗出發,討論了信息管理軟件中如何通過哈希和加密進行數據保護。但是從文章評論中也可以
Git服務器安裝詳解及安裝遇到問題解決方案【轉】
bsp erb 倉庫 .... gnu libcurl 執行 body ebs 轉自:http://www.cnblogs.com/grimm/p/5368777.html git是一個不錯的版本管理的工具。現在自己在搞一個簡單的應用程序開發,想使用git來進行管理。
【轉】Nodejs學習筆記(一)--- 簡介及安裝Node.js開發環境
ack 目錄 javascrip 難度 時間 網站開發 clas jetbrains 常用 目錄 學習資料 簡介 安裝Node.js npm簡介 開發工具 Sublime Node.js開發環境配置 擴展:安裝多版本管理器 學習資料 1.深入淺出Node.j
【轉】C#獲取客戶端及服務器端主機信息及其獲取IP地址
string c# forward ria 工具 ip地址 客戶 ext add 原文發布時間為:2009-10-28 —— 來源於本人的百度文章 [由搬家工具導入]小结:1、REMOTE_ADDR 不&
【字符串處理算法】字符串包含的算法設計及C代碼實現【轉】
字符串 整數 blank -- c語言 ipp lines c118 多個 轉自:http://blog.csdn.net/zhouzhaoxiong1227/article/details/50679587 版權聲明:本文為博主原創文章,對文章內容有任何意見或建議,