Linux调试——gdb调试器的简单使用调试coredump文件
文章目錄
- 一、背景
- 二、gdb的指令與使用
- 1.gdb的基本指令。
- 2.gdb指令的簡單使用
- 1.進(jìn)入gdb模式
- 2.實(shí)例說明
- 三、調(diào)試coredump文件
- 前提:本質(zhì)上是在調(diào)試程序崩潰之后的內(nèi)存鏡像文件。
- 內(nèi)存鏡像文件保存的是,程序在崩潰的一瞬間內(nèi)存當(dāng)中的值
一、背景
- 程序的發(fā)布方式有兩種,debug和release模式,要在linux中調(diào)試,需要使用到一個(gè)工具——gdb調(diào)試器。
- gdb調(diào)試器類似于VS中的debug模式。
- Linux gcc/g++出來的二進(jìn)制程序,默認(rèn)是release模式
- 要使用debug模式,必須在源代碼生成二進(jìn)制程序的時(shí)候,加上-g選項(xiàng)!
二、gdb的指令與使用
1.gdb的基本指令。
首先列舉下gdb調(diào)試器的基本指令。
2.gdb指令的簡單使用
前面介紹了gdb調(diào)試器的一些指令,現(xiàn)在選一些指令實(shí)際應(yīng)用一下。
1.進(jìn)入gdb模式
1. vim一個(gè)簡單的sum.c文件:
2. 使用gcc -g指令,生成可以gdb的文件:
3. gdb + 文件名,進(jìn)入調(diào)試模式:
2.實(shí)例說明
出現(xiàn)如上界面,表示已經(jīng)進(jìn)入了gdb模式,接下來介紹幾個(gè)gdb下的指令的使用。
list/l 行號:輸入l+行號則跳到輸入行號的位置,只輸入l則從第一行開始顯示十行內(nèi)容,在輸入l會(huì)跳轉(zhuǎn)到后面十行,如圖。
list/l 函數(shù)名:列出某個(gè)函數(shù)名,以sum.c的sum函數(shù)為例。輸入l sum。
r或run:運(yùn)行程序。 輸入 r,可以看到輸出了打印結(jié)果:11
break/b 行號:在某一行設(shè)置斷點(diǎn),例如現(xiàn)在在12,13,14行分別設(shè)置斷點(diǎn),設(shè)置成功會(huì)有提示,并給出斷點(diǎn)序號Breakpoint n。
info break(i b):查看斷點(diǎn)信息,輸入info break,可以看到斷點(diǎn)信息,地址和所在行號。
disable 斷點(diǎn)的序號:使斷點(diǎn)失效
可以看到,使斷點(diǎn)1,2失效后,執(zhí)行程序直接跳到了斷點(diǎn)3處。
7. enable 斷點(diǎn)的序號:使斷點(diǎn)生效
8. delete breakpoints:刪除所有斷點(diǎn)
9. delete breakpoints n:刪除序號為n的斷點(diǎn),刪除斷點(diǎn)1后,執(zhí)行i b,斷點(diǎn)1消失。
n或next:單條執(zhí)行,相當(dāng)于windows中的逐過程執(zhí)行,VS中的F10(需要先run)
單條執(zhí)行,不進(jìn)入函數(shù)內(nèi)部
s或step:進(jìn)入函數(shù)調(diào)用,相當(dāng)于windows中的逐語句執(zhí)行,VS中的F11(需要先run)
執(zhí)行s后,進(jìn)入了函數(shù)sum內(nèi)部并逐語句執(zhí)行。
continue?:從當(dāng)前位置開始連續(xù)而非單步執(zhí)行程序(遇到下一個(gè)斷點(diǎn)時(shí)就會(huì)停止運(yùn)行)
print(p):打印變量的值
,首先執(zhí)行到int a后,執(zhí)行p a,顯示a的值為5
三、調(diào)試coredump文件
前提:本質(zhì)上是在調(diào)試程序崩潰之后的內(nèi)存鏡像文件。
產(chǎn)生coredump文件的條件:
1.linux操作系統(tǒng)當(dāng)中,需要設(shè)置core size的大小,使用指令 ulimit -c size,如:
,可執(zhí)行該語句將core size大小設(shè)置為無窮,這樣當(dāng)調(diào)試程序崩潰后,就會(huì)生成內(nèi)存鏡像文件
2.磁盤大小足夠
內(nèi)存鏡像文件保存的是,程序在崩潰的一瞬間內(nèi)存當(dāng)中的值
執(zhí)行g(shù)db [可執(zhí)行程序][coredump文件],可查看coredump文件的信息,獲悉是什么地方發(fā)生了錯(cuò)誤。
舉個(gè)例子:
,首先創(chuàng)建一個(gè)明顯有空指針賦值的錯(cuò)誤文件。然后gcc編譯并添加-g。
編譯完成后,執(zhí)行編譯后的文件testfault,可以發(fā)現(xiàn)顯示了段錯(cuò)誤(吐核)的錯(cuò)誤,這個(gè)錯(cuò)誤就是內(nèi)存訪問越界或者空指針引起的。ls查看列表文件
出現(xiàn)了core.20390的文件 gdb進(jìn)入,
主要的信息在倒數(shù)幾行。program terminated with signal 11,Segmentaion fault表示程序收到了11號信號,產(chǎn)生了段錯(cuò)誤。
圈出來的地方表示,崩潰的代碼出現(xiàn)在testfault.c文件的第七行。
還可以通過:
1. bt:查看調(diào)用堆棧
2.f[堆棧序號]:跳轉(zhuǎn)到某一個(gè)具體的堆棧
可以看到執(zhí)行bt后,調(diào)用堆棧的信息列出,執(zhí)行f 0跳到堆棧處,看到錯(cuò)誤行。
tips:
總結(jié)
以上是生活随笔為你收集整理的Linux调试——gdb调试器的简单使用调试coredump文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言——程序的编译+链接(linux+
- 下一篇: C语言——常见的字符串函数+内存操作函数