個人主頁:兜里有顆棉花糖
歡迎 點贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng)
收錄于專欄【Linux專欄】??
本專欄旨在分享學(xué)習(xí)Linux的一點學(xué)習(xí)心得,歡迎大家在評論區(qū)討論??
演示環(huán)境:centos7
如果還未安裝gdb的話,輸入下面命令進行安裝即可:
yum install gdb
一、背景引入
首先,gdb是基于命令行式的調(diào)試工具。
debug
和release
是軟件開發(fā)過程中的兩個不同階段或模式。debug用于開發(fā)和調(diào)試軟件,并提供更多的調(diào)試信息和錯誤排查的能力。而release用于最終交付給用戶和客戶的版本,它經(jīng)過優(yōu)化和編譯,以提供更好的性能和較小的體積。
簡單來說就是在軟件開發(fā)階段利用debug模式來進行調(diào)試,而release模式一般用于公司的測試人員進行最終的測試。
debug
版本的代碼是可以被調(diào)試的(debug版本的代碼在形成可執(zhí)行程序的時候會有調(diào)試信息),而release
版本的代碼不可以調(diào)試(沒有調(diào)試信息)。
在Linux中究竟是使用哪一種模式的代碼呢?我們來看一下:
輸入命令:gdb test
當(dāng)然我們無法直接對代碼進行調(diào)試,我們輸入命令:readelf -S test
(讀取一個可執(zhí)行程序的二進制構(gòu)成),請看:
再次發(fā)現(xiàn)其中沒有debug調(diào)試信息,輸入命令(查看debug調(diào)試信息):readelf -S test | grep -i debug
,運行結(jié)果如下(發(fā)現(xiàn)什么都沒有):
所以,通過以上我們就可以知道gcc編譯是通過release方式進行發(fā)布的,無法進行調(diào)試。
二、如果才能進行debug調(diào)試
我們需要修改Makefile文件,請看:
通過make命令形成可執(zhí)行程序如下:
輸入命令(查看剛剛新形成的可執(zhí)行程序
test-debug
的debug信息):readelf -S test-debug | grep -i debug
,結(jié)果如下:
之所以test-debug
可執(zhí)行程序能夠調(diào)試就是因為上圖中的debug可調(diào)試信息。
總結(jié):如果代碼要能夠被gdb調(diào)試工具進行調(diào)試的話,必須由debug發(fā)布,Makefile文件中必須加上-g
。
三、gdb常用選項
gdb常用選項如下:
-
list
或l
行號:顯示源代碼文件,接著上次的位置往下列,每次列10行。 -
list
或l
函數(shù)名:列出某個函數(shù)的源代碼。 -
r
或run
:運行程序。 -
n
或next
:單條執(zhí)行(相當(dāng)于VS中的F10,即逐過程
)。 -
s
或step
:進入函數(shù)調(diào)用(相當(dāng)于VS中的F11,即逐語句
)。 -
b/break 行號
:在某一行設(shè)置斷點。 -
break 函數(shù)名
:在某個函數(shù)開頭設(shè)置斷點。 -
info b
或info break
:查看斷點信息。 -
finish
:執(zhí)行到當(dāng)前函數(shù)返回,然后停下來等待命令。 -
print(p)
:打印表達式的值,通過表達式可以修改變量的值或者調(diào)用函數(shù)。 -
p 變量
:打印變量值。 -
set var
:修改變量的值。 -
c
或continue
:從當(dāng)前位置開始連續(xù)而非單步執(zhí)行程序。 -
r
或run
:從開始連續(xù)而非單步執(zhí)行程序。 -
delete breakpoints
:刪除所有斷點。 -
delete breakpoints n
:刪除序號為n的斷點。 -
disable breakpoints
或disable 斷點序號
:禁用斷點。 -
display 變量名
:跟蹤查看一個變量,每次停下來都顯示它的值 -
enable breakpoints
或enable 斷點序號
:啟用斷點 -
breaktrace(或bt)
:查看各級函數(shù)調(diào)用及參數(shù) -
info(i) locals
:查看當(dāng)前棧幀局部變量的值
啟動gdb命令:
gdb 可執(zhí)行程序
例如:輸入命令:gdb test
,結(jié)果如下:
有兩種方式可以退出gdb:
方法1:ctrl + d
方法2:q
或者quit
通過
list 行號
來顯示我們編寫的源代碼,演示如下:
舉例:
info b
舉例(顯示斷點信息):
b 行號
舉例:
p 變量
舉例(跟蹤查看一個變量,每次停下來都顯示它的值
):display 變量名
與undisplay 變量名/常顯示變量的序號
相反
舉例:
until X行號:跳至X行
相當(dāng)于跳過一定行數(shù)的代碼塊文章來源:http://www.zghlxwxcb.cn/news/detail-729315.html
舉例:
finish
(執(zhí)行到當(dāng)前函數(shù)返回,然后挺下來等待命令)文章來源地址http://www.zghlxwxcb.cn/news/detail-729315.html
到了這里,關(guān)于Linux環(huán)境下gdb調(diào)試方法與演示的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!