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