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