1、生成core dump文件的方法:
$ ulimit -c //查看是否為0
如果為0
$ ulimit -c unlimited
這樣在程序崩潰以后會在當(dāng)前目錄生成一個core.xxxx的文件
2、調(diào)試core dump文件
生成了core.xxx文件以后
$ gdb ./應(yīng)用程序 core.xxxx
就會恢復(fù)現(xiàn)場到你的程序崩潰的那一刻
(gdb)bt //這個命令會列出程序崩潰時的堆棧信息,一層一層會有標號 #0 #1 #2 .......
如果你要查看某一層的信息,你需要在切換當(dāng)前的棧,一般來說,程序停止時,最頂層的棧就是當(dāng)前棧,如果你要查看棧下面層的詳細信息,首先要做的是切換到你想看的棧
(gdb)f N //N是你想要切換的棧的標號,達到后可以用 ‘p 變量’ 查看變量的值,以查找異常出現(xiàn)的原因
info args 打印出當(dāng)前函數(shù)的參數(shù)名及其值。 info locals 打印出當(dāng)前函數(shù)中所有局部變量及其值。 info catch 打印出當(dāng)前的函數(shù)中的異常處理信息。
3、gdb調(diào)試命令
l 列出此刻運行到代碼行的函數(shù)的上下文代碼
b 設(shè)置斷點
r 開始運行程序
s 單步調(diào)試,進入函數(shù)
n 單步,不進入下一層函數(shù)
n k(一個數(shù)字) 這樣是相當(dāng)于輸入了k次n,也就是走了k步
c 繼續(xù)運行程序(一般是跑到斷點后,跟了幾步,輸入c繼續(xù)往下一個斷點跑)
[enter] 回車鍵默認執(zhí)行上一次的命令
finish 執(zhí)行完當(dāng)前函數(shù)返回到調(diào)用他的函數(shù),例如單步執(zhí)行如果進入到了某函數(shù),但你又想退出該函數(shù)
u(until) 制定程序直到退出當(dāng)前的循環(huán)體,輸入u自動執(zhí)行完全部的循環(huán)
break 34 if var=12 //設(shè)置條件斷點,當(dāng)var等于12的時候就在34行設(shè)置斷點watch i != 10 //監(jiān)控某一個條件,然后設(shè)置斷點,如果i不等于10的時候,就設(shè)置斷點
break func //為某一個函數(shù)設(shè)置斷點
break filename:N //在某一個文件的第N行設(shè)置斷點
info breakpoints 顯示所有的斷點的信息
delete N //刪除標號為N的斷點
delete 刪除所有的斷點
clear N //清楚N上面的所有的斷點
p var 打印變量var的值
//打印字符串的時候,有長度限制,想打印完整的長字符串,通過命令set PRint element 0就可以了
p /x var 以16進制顯示var的值
x 16進制
d 10進制
t 二進制
c 按字符格式顯示變量
f 按浮點數(shù)
print *a@10 //如果a是一個數(shù)組,這樣顯示數(shù)據(jù)的10個元素的值
print var=10 //修改運行時變量的值
whatis var //顯示一個變量的類型
ptype var //更詳細的方式顯示變量var的類型,會打印出var的結(jié)構(gòu)定義
4、編譯的時候要加入-g選項,才可以對程序進行跟蹤
5、gdb調(diào)試程序的時候打印變量值會出現(xiàn)<value optimized out> 情況,可以在gcc編譯的時候加上 -O0參數(shù)項,意思是不進行編譯優(yōu)化,調(diào)試的時候就會順暢了,運行流程不會跳來跳去的,發(fā)布項目的時候記得不要在使用 -O0參數(shù)項,gcc 默認編譯或加上-O2優(yōu)化編譯會提高程序運行速度
新聞熱點
疑難解答