日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux调试——gdb调试器的简单使用调试coredump文件

發布時間:2025/3/21 linux 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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調試器的基本指令。

  • list/l 行號:顯示binFile源代碼,接著上次的位置往下列,每次列10行。
  • list/l 函數名:列出某個函數的源代碼。
  • r或run:運行程序。
  • n 或 next:單條執行。
  • s或step:進入函數調用。
  • break(b)行號:在某一行設置斷點。
  • break 函數名:在某個函數開頭設置斷點。
  • info break :查看斷點信息。
  • finish:執行到當前函數返回,然后停下來等待命令。
  • print(p):打印表達式的值,通過表達式可以修改變量的值或者調用函數 。
  • p變量:打印變量值。
  • set var:修改變量的值。
  • continue(或c):從當前位置開始連續而非單步執行程序。
  • run(或r):從開始連續而非單步執行程序。
  • delete breakpoints:刪除所有斷點。
  • delete breakpoints n:刪除序號為n的斷點。
  • disable breakpoints:禁用斷點。
  • enable breakpoints:啟用斷點。
  • info(或i) breakpoints:參看當前設置了哪些斷點。
  • display 變量名:跟蹤查看一個變量,每次停下來都顯示它的值。
  • undisplay:取消對先前設置的那些變量的跟蹤。
  • until X行號:跳至X行 。
  • breaktrace(或bt):查看各級函數調用及參數。
  • info(i) locals:查看當前棧幀局部變量的值。
  • quit / ctrl+d:退出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:

  • 11信號:解引用空指針,解引用野指針,越界訪問內存
  • 6號信號:double free
  • 總結

    以上是生活随笔為你收集整理的Linux调试——gdb调试器的简单使用调试coredump文件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。