??博客主頁(yè):小王又困了
??系列專欄:Linux
??人之為學(xué),不日近則日退
??感謝大家點(diǎn)贊??收藏?評(píng)論??
目錄
一、背景知識(shí)介紹
二、gdb指令介紹
一、背景知識(shí)介紹
? ? ?在軟件開發(fā)中,通常會(huì)有兩種主要的構(gòu)建配置:Debug(調(diào)試)和Release(發(fā)布)。這兩種配置的存在是為了在不同的開發(fā)和使用階段提供不同的優(yōu)化和調(diào)試支持。以下是它們存在的主要原因:
??調(diào)試配置:
- 符號(hào)信息:?Debug 配置通常包含完整的符號(hào)信息,這使得在調(diào)試過程中能夠準(zhǔn)確地追蹤到源代碼的行號(hào)和調(diào)用堆棧信息。這對(duì)于開發(fā)人員在調(diào)試應(yīng)用程序時(shí)非常重要。
- 優(yōu)化程度低:?Debug 配置一般不進(jìn)行代碼優(yōu)化,以確保生成的代碼更易于調(diào)試。變量和表達(dá)式的值通常保留在內(nèi)存中,而不進(jìn)行過多的優(yōu)化操作。
??發(fā)布配置:
- 符號(hào)信息:?Release 配置通常會(huì)剔除符號(hào)信息,減小可執(zhí)行文件的大小,并防止未經(jīng)授權(quán)的人員通過符號(hào)信息獲取源代碼的詳細(xì)信息。
- 優(yōu)化成程度高:?Release 配置通常會(huì)進(jìn)行更多的代碼優(yōu)化,以提高應(yīng)用程序的性能。這包括刪除不必要的代碼、內(nèi)聯(lián)函數(shù)、變量寄存器優(yōu)化等。
gcc/g++編譯器默認(rèn)是以release的模式編譯得到可執(zhí)行程序,我們使用gdb是無法進(jìn)行調(diào)試的。
想進(jìn)行代碼調(diào)試,我們就要讓代碼以debug的模式發(fā)布,需要加-g選項(xiàng)。
gcc code.c -o mycode -g
我們可以通過readelf mycode-d -S | grep debug查看mydoe-d文件中的debug信息。
二、gdb指令介紹
? ? ?我會(huì)通過下面這段代碼,來給大家演示gdb的使用。
#include <stdio.h>
int Add(int n)
{
int ret=0;
int i=0;
for(i=0;i<n;i++)
{
ret+=i;
}
return ret;
}
int main()
{
int num=50;
int sum=Add(num);
printf("%d\n",sum);
return 0;
}
??進(jìn)入gdb環(huán)境:
- gdb binFile:進(jìn)入gdb環(huán)境,binFile是一個(gè)可執(zhí)行程序。
??退出gdb環(huán)境:
- ctrl + d 或 quit :退出gdb環(huán)境
??顯示代碼:
- ?list 或 l :顯示binFile源代碼,接著上次的位置往下列,每次列10行。
- list num:num是行號(hào),將源代碼的第num行在中間位置顯示。
gdb會(huì)自動(dòng)記錄上一次執(zhí)行的指令,我們執(zhí)行一次 list 后,可以直接回車,就可以看到完整的源代碼。
??查看函數(shù):
- list Func或?l Func:Func是函數(shù)名,列出某個(gè)函數(shù)的源代碼。
??運(yùn)行程序:
- run 或 r :運(yùn)行程序,不是單步執(zhí)行程序。
??設(shè)置斷點(diǎn):
- break num或b num:num表示行號(hào),在某行設(shè)置斷點(diǎn)。
??查看斷點(diǎn):
- info break:查看斷點(diǎn)信息。
??刪除斷點(diǎn):
- d num:num表示斷點(diǎn)的編號(hào),刪除斷點(diǎn)。
我們?cè)趧h除斷點(diǎn)時(shí),這里的num表示的不是行號(hào),我們要輸入要?jiǎng)h除斷點(diǎn)的編號(hào)。
注意:如果在調(diào)試過程中退出,那么再次進(jìn)入調(diào)試環(huán)境,上一次的調(diào)試信息會(huì)丟失,即之前設(shè)置的斷點(diǎn)都沒了。
??單步執(zhí)行:
- ?n 或next:逐過程,單條執(zhí)行,當(dāng)有函數(shù)調(diào)用時(shí),不會(huì)進(jìn)入函數(shù)內(nèi)部。
- ?s 或step:逐語句,進(jìn)入函數(shù)調(diào)用。
- finish:跳出當(dāng)前函數(shù),執(zhí)行完當(dāng)前函數(shù)返回,然后停下來等待命令。
flish指令可以快速的幫我們查看問題是不是出在當(dāng)前函數(shù)中。?
??查看變量的值:
- ?p 變量:打印變量的值。
- display 變量:跟蹤查看一個(gè)變量,每次停下來都顯示它的值。
- undisplay num:取消對(duì)先前設(shè)置的那些變量的追蹤,其中num是先前設(shè)置的跟蹤變量所對(duì)應(yīng)的編號(hào)。?
- info locals:查看當(dāng)前函數(shù)棧幀中所有局部變量的值。
??其他指令:
- until x:跳至x行,可以讓我們快速的運(yùn)行代碼塊。
- ?c 或continue:繼續(xù)執(zhí)行直到下一個(gè)斷點(diǎn)。
-
disable?breakpoints:禁用斷點(diǎn)。
- enable?breakpoints:?jiǎn)⒂脭帱c(diǎn)
- break 函數(shù)名:在函數(shù)開頭設(shè)置斷點(diǎn)。
- backtrace:查看堆棧。
- set var:修改變量的值。
- break filename:line_number:在文件的特定行設(shè)置斷點(diǎn)。示例:
b code.c:15
在code.c這個(gè)源文件的第15行設(shè)置斷點(diǎn)。
??結(jié)語:?文章來源:http://www.zghlxwxcb.cn/news/detail-761028.html
? ? ?本次的內(nèi)容到這里就結(jié)束啦。希望大家閱讀完可以有所收獲,同時(shí)也感謝各位讀者三連支持。文章有問題可以在評(píng)論區(qū)留言,博主一定認(rèn)真認(rèn)真修改,以后寫出更好的文章。你們的支持就是博主最大的動(dòng)力。文章來源地址http://www.zghlxwxcb.cn/news/detail-761028.html
到了這里,關(guān)于『Linux升級(jí)路』基礎(chǔ)開發(fā)工具——gdb篇的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!