linux中g(shù)db的入門使用教程
前言
gdb是linux下非常好用的一個(gè)調(diào)試工具,雖然它是命令行模式的調(diào)試工具,但是它的功能強(qiáng)大到你無法想象,這里簡(jiǎn)單介紹下gdb的使用方法,需要的朋友們下面來一起看看詳細(xì)的介紹吧。
斷點(diǎn)
在代碼的指定位置中斷,使程序在此中斷。
- break <function> 在進(jìn)入指定函數(shù)時(shí)停住
- break <linenum> 在指定行號(hào)停住。
- break +/-offset 在當(dāng)前行號(hào)的前面或后面的offset行停住。offiset為自然數(shù)。
- break filename:linenum 在源文件filename的linenum行處停住。
- break ... if <condition> ...可以是上述的參數(shù),condition表示條件,在條件成立時(shí)停住。比如在循環(huán)境體中,可以設(shè)置break if i=100,表示當(dāng)i為100時(shí)停住程序。
案例:
(gdb) break sc_smartcontract_handler.cpp:45 Breakpoint 4 at 0x424d42: file sc_smartcontract_handler.cpp, line 45.
對(duì)斷點(diǎn)的相關(guān)操作
- delete 刪除所有斷點(diǎn)
- delete breakpoint [n] 刪除某個(gè)斷點(diǎn)
- disable breakpoint [n] 禁用某個(gè)斷點(diǎn)
- enable breakpoint [n] 使能某個(gè)斷點(diǎn)
- info breakpoints [n] 查看當(dāng)前斷點(diǎn)信息
觀察點(diǎn)
捕捉點(diǎn)用來補(bǔ)捉程序運(yùn)行時(shí)的一些事件。如:載入共享庫(動(dòng)態(tài)鏈接庫)、C++的異常等。通常也是用來定位bug。
捕捉點(diǎn)的命令格式是:catch <event>,event可以是下面的內(nèi)容
- watch <expr> 變量發(fā)生變化時(shí)中斷
- rwatch <expr> 變量被讀時(shí)中斷
- awatch <expr> 變量值被讀或被寫時(shí)中斷
可以通過info watchpoints [n]命令查看當(dāng)前觀察點(diǎn)信息
查看變量
最常用的查看變量的方法是
(gdb) print {變量名}
(gdb) print argc $1 = 1
如果打印數(shù)組,由于默認(rèn)的設(shè)置,可能打印的數(shù)組尾部部分沒有顯示,可以通過如下的命令設(shè)置打印數(shù)組的最大長(zhǎng)度
(gdb) set print elements 300
調(diào)試中查看代碼
- list function 如list main:顯示main函數(shù)附近的代碼
- list file:function 如list main.c:main:顯示main.c中的main函數(shù)附近的代碼
- list n1,n2 如list 10,20,顯示當(dāng)前文件的10到20行
雖然list已經(jīng)很方便了, 但還是不盡人意. 如果能夠在運(yùn)行的同時(shí)顯示代碼就好了, 答案是肯定的.
使用如下命令啟動(dòng)gdb: gdb -tui 項(xiàng)目名 或者在啟動(dòng)gdb后, 輸入命令focus,如圖:
恢復(fù)程序運(yùn)行和單步調(diào)試
在gdb中,和調(diào)試步進(jìn)相關(guān)的命令主要有如下幾條:
- continue 繼續(xù)運(yùn)行程序直到下一個(gè)斷點(diǎn)(類似于VS里的F5)
- next 逐過程步進(jìn),不會(huì)進(jìn)入子函數(shù)(類似VS里的F10)
- setp 逐語句步進(jìn),會(huì)進(jìn)入子函數(shù)(類似VS里的F11)
- until 運(yùn)行至當(dāng)前語句塊結(jié)束
- finish 運(yùn)行至函數(shù)結(jié)束并跳出,并打印函數(shù)的返回值(類似VS的Shift+F11)
在特定線程中中斷
你可以定義你的斷點(diǎn)是否在所有的線程上,或是在某個(gè)特定的線程。GDB很容易幫你完成這一工作。
- break <linespec> thread <threadno>
- break <linespec> thread <threadno> if ...
linespec指定了斷點(diǎn)設(shè)置在的源程序的行號(hào)。threadno指定了線程的ID,注意,這個(gè)ID是GDB分配的,你可以通過"info threads"命令來查看正在運(yùn)行程序中的線程信息。如果你不指定thread <threadno>則表示你的斷點(diǎn)設(shè)在所有線程上面。你還可以為某線程指定斷點(diǎn)條件。如:
(gdb) break frik.c:13 thread 28 if bartab > lim
當(dāng)你的程序被GDB停住時(shí),所有的運(yùn)行線程都會(huì)被停住。這方便你你查看運(yùn)行程序的總體情況。而在你恢復(fù)程序運(yùn)行時(shí),所有的線程也會(huì)被恢復(fù)運(yùn)行。那怕是主進(jìn)程在被單步調(diào)試時(shí)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
CentOS7安裝調(diào)試Mysql數(shù)據(jù)庫的步驟詳解【實(shí)例】
這篇文章主要介紹了CentOS7安裝調(diào)試Mysql數(shù)據(jù)庫,本文分步驟通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10Linux 安裝二進(jìn)制MySQL 及 破解MySQL密碼的方法
這篇文章主要介紹了Linux 安裝二進(jìn)制MySQL 及 破解MySQL密碼的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09Apache虛擬主機(jī)VirtualHost配置項(xiàng)詳解
在Apache中,VirtualHost容器用于定義一個(gè)虛擬主機(jī)的配置,它允許在單一的物理服務(wù)器上托管多個(gè)不同的網(wǎng)站,每個(gè)網(wǎng)站可以有自己的域名、文檔根目錄、錯(cuò)誤日志等,這篇文章主要介紹了Apache虛擬主機(jī)VirtualHost配置項(xiàng)詳解,需要的朋友可以參考下2024-07-07LINUX中詳解AWK內(nèi)建變量FS,NF,NR,RT,RS,ORS,OFS
很多朋友沒搞告白AWK內(nèi)建變量FS,NF,NR,RT,RS,ORS,OFS的方法和原理,小編給大家總結(jié)了詳細(xì)的內(nèi)容,一起來學(xué)習(xí)下思路。2017-11-11CentOS7連接XShell與網(wǎng)絡(luò)配置的方法
這篇文章主要介紹了如何使用CentOS7連接XShell與網(wǎng)絡(luò)配置的方法,可以更好的幫助大家工作和學(xué)習(xí),感興趣的小伙伴可以了解下2020-05-05