一、gdb的一些基礎(chǔ)命令
l
:顯示代碼
l n
:跳轉(zhuǎn)到當(dāng)前代碼頁(yè)的第n行的代碼
l filename.c :n
:跳轉(zhuǎn)到filename.c文件的第n行代碼
b 行號(hào)
:加斷點(diǎn)
info break
:查看斷點(diǎn)信息
delete 斷點(diǎn)編號(hào)
:刪除斷點(diǎn)
r
,運(yùn)行程序
n
,單步執(zhí)行
c
,繼續(xù)執(zhí)行,遇到斷點(diǎn)停止執(zhí)行
p
,打印
s
,進(jìn)入函數(shù)
finish
,退出函數(shù)
q
,退出gdb
二、調(diào)試示例
先寫一個(gè)main.c程序,該程序用來(lái)循環(huán)輸出從鍵盤輸入的字符串,直到遇到"end"結(jié)束循環(huán):
編譯并運(yùn)行main.c:
發(fā)現(xiàn)和我們的預(yù)期并不一樣,在輸入"end"之后并沒(méi)有結(jié)束循環(huán),通過(guò)Ctrl+c結(jié)束這個(gè)進(jìn)程。
從上圖可以看出目前并不可以進(jìn)行調(diào)試,之所以能打出一些信息,是因?yàn)檫@些信息是gdb打印出來(lái)的,而main程序還沒(méi)有執(zhí)行,下面的這句話
(1)編譯和跟蹤
按照gcc -o main main.c -g
去編譯main.c生成可執(zhí)行程序main,并用gdb去跟蹤main程序:
(2)顯示所編寫的代碼
通過(guò)gdb指令l
顯示代碼
一次只能顯示10行代碼。
(3)設(shè)置斷點(diǎn)
語(yǔ)法形式:break 行號(hào)
,break可以簡(jiǎn)寫為b
將斷點(diǎn)加到第13行:
可以繼續(xù)下斷點(diǎn):
查看加了哪些斷點(diǎn)info break
:
刪除斷點(diǎn)delete Num
:
刪除第2個(gè)斷點(diǎn):
(4)運(yùn)行程序進(jìn)行調(diào)試
輸入run
,可以簡(jiǎn)寫為r
,按回車:
當(dāng)前程序執(zhí)行到了13行停止。
輸入n
,讓程序單步執(zhí)行:
從上圖可以看出輸入了字符串"hello",然后程序運(yùn)行到了17行的if語(yǔ)句。
這時(shí),我們輸入p buff
來(lái)查看一些buff中的內(nèi)容:
可以看到,當(dāng)前buff中存放的是字符串"hello\n"。
繼續(xù)輸入n
單步執(zhí)行:
當(dāng)前程序又執(zhí)行到了13行。
我們繼續(xù)單步執(zhí)行,這次輸入字符串"end",程序跳轉(zhuǎn)到17行的if語(yǔ)句:
此時(shí),我們?cè)佥斎?code>p buff來(lái)查看一些buff中的內(nèi)容:
可以看到,當(dāng)前buff中存放的是字符串"end\n",這和我們輸入的字符串"end"并不相同。
因此,再繼續(xù)執(zhí)行時(shí),程序依然會(huì)進(jìn)入循環(huán):
此時(shí),我們就通過(guò)調(diào)試發(fā)現(xiàn)了代碼中存在的問(wèn)題。
輸入q
退出gdb,此時(shí)會(huì)提示如果要退出會(huì)殺死剛剛的main程序,是否要退出,輸入y
表示退出,按回車就退出gdb。
退出gdb之后,剛剛的main程序也就結(jié)束了:
將strcmp()改為strncmp():
此時(shí),我們?cè)偃ゾ幾gmain.c,執(zhí)行main程序,結(jié)果如下:
因篇幅問(wèn)題不能全部顯示,請(qǐng)點(diǎn)此查看更多更全內(nèi)容
Copyright ? 2019- 91gzw.com 版權(quán)所有 湘ICP備2023023988號(hào)-2
違法及侵權(quán)請(qǐng)聯(lián)系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市萬(wàn)商天勤律師事務(wù)所王興未律師提供法律服務(wù)