GDB入門教程之如何使用GDB啟動調試

      網友投稿 738 2025-04-01

      寫在前面:今天開始嘗試寫寫除Vim外的其他內容,仍然是以技術為主,可能涉及的內容包括Linux、正則表達式、gdb、makefile等內容,不知道小伙伴們有沒有興趣看呢?不管如何,也算是我自己的知識沉淀吧~?我把公眾號改名了,你們猜猜新名字是啥?

      GDB (The GNU Project Debugger)是 Linux 系統下調試 C 和 C++ 程序的主要神兵。本文介紹多種方式下使用 GDB 啟動進程調試的方法和命令。

      要使得 C 和 C++ 程序能在 GDB 下正常進行調試,必須在程序編譯期間把基本的調試信息(如變量名、函數名、函數調用堆棧等)添加到可執行文件中。gcc、cc、g++等編譯器可通過編譯參數 -g 指定添加調試信息。

      當使用GDB加載不包含調試信息的二進制文件或進程時,GDB終端會提示錯誤信息:"no debugging symbols found"。

      一、GDB調試未執行程序

      對于本地的某個二進制文件 demo ( GDB 也支持遠程調試),若其啟動時不需要命令行參數,則可以在shell下使用命令 gdb demo 進入 GDB,并輸入 run (縮寫形式 r) 啟動對demo的調試。

      若 demo 程序啟動時需要命令行參數,則可以在使用 gdb demo 命令進入GDB后,使用命令 run arg1 arg2... 提供命令行參數并啟動對demo程序的調試。

      二、GDB調試運行中程序

      使用GDB調試正在運行的程序時,必須先找到該程序運行在操作系統中的進程號 (PID)。可以使用 Linux 命令 ps-ef|grep-w demo 、 ps-aux|grep-w demo 或 pidof demo獲取到 demo 進程當前的進程號。

      獲取到待調試的目標進程號后 (假設為 pid ),可以使用 gdb 命令進入 GDB 終端,并使用 attach pid 的方式啟動對當前正在運行的 demo 進程的 GDB 調試。

      也可以使用 gdb-p pid 命令直接進入 GDB 并啟動對該進程的調試。

      對于使用多線程模式的進程,可以在 GDB 中使用 info threads 命令顯示當前進程中所有線程的基本調試信息,包括:GDB 分配的線程ID、線程堆棧等。線程列表中,GDB 線程 ID 左側的 * 表示當前真正被調試的線程。

      GDB入門教程之如何使用GDB啟動調試

      可通過 thread tid 命令切換和啟動對 GDB 線程號為 tid 的線程進行調試。關于使用 GDB 調試多進程和多線程,后續會有獨立的文章進行詳細介紹。

      三、GDB調試core文件

      當程序在 Linux 系統下發生異常崩潰(如段錯誤)時,內核會將該應用程序在崩潰發生時的內存數據、程序調用堆棧等核心信息轉存到磁盤,這種功能稱之為 core dump,中文可翻譯為 核心轉儲。

      core dump 是程序異常退出時的內存快照,是異常發生后對程序進行現場還原和故障排查的關鍵線索。Linux 進程 core 掉可以說是所有 C 和 C++ 程序員接觸最頻繁而又最不想碰到的問題。

      可通過 ulimit-c 查看和指定 core 文件的大小,通過修改 /proc/sys/kernel/core_pattern 文件可指定 core 文件保存在本地磁盤中的路徑和文件名格式。

      GDB 對 core 文件的分析和調試提供了非常強大的功能支持,可使用 gdb demo/data/core/xxx 啟動對 demo 進程某次產生的core文件 /data/core/xxx 的分析和調試,也可以使用

      gdb-c/data/core/xxx 加載和分析 core 文件。

      GDB 正常加載 core 文件后,便可以使用 backtrace (縮寫形式 bt) 顯示程序異常退出時刻的函數堆棧情況,再使用 frame、 print、 up、 down、 where 等命令對異常現場進行詳細分析。

      為了讓程序產生 dump ,將 demo.cpp 中的輸出語句 printf("%s: %d\n",(char*)ptr,array[i]); 改成 printf("%s: %s\n",(char*)ptr,array[i]); 后在編譯時加入 -w 參數忽略掉警告后重新生成 demo 可執行文件。

      關于 GDB 調試程序和 core 文件的具體方法和命令,請關注公眾號 GDB 系列的后續文章。

      PS:使用 quit (縮寫形式 q) 可退出 GDB。

      Linux 任務調度

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:wps表格怎么打印證件照 wps表格打印證件照的方法
      下一篇:WORD文檔在修改時會把后面的字刪除(word文檔添加文字時為什么后面的就刪除?)
      相關文章
      亚洲精品网站在线观看不卡无广告| 亚洲福利电影在线观看| 亚洲精品一区二区三区四区乱码| 亚洲综合无码AV一区二区| 国产亚洲精品国看不卡| 亚洲精品久久久www| 国产亚洲精品成人久久网站| 亚洲码欧美码一区二区三区| 亚洲精品成a人在线观看☆| 亚洲另类自拍丝袜第五页| 国产精品无码亚洲一区二区三区| 亚洲国产成人久久精品软件| 久久亚洲精品高潮综合色a片| 亚洲av无码成人精品国产 | 亚洲视频一区二区三区| 亚洲综合久久久久久中文字幕| 亚洲精品电影在线| 亚洲a∨无码男人的天堂| 亚洲午夜无码久久久久软件| 亚洲国产欧洲综合997久久| 亚洲av无码专区国产不乱码 | 亚洲成a人片在线观看天堂无码 | 亚洲码一区二区三区| 久久久久se色偷偷亚洲精品av| 亚洲AV男人的天堂在线观看| 亚洲精华国产精华精华液好用| 爱爱帝国亚洲一区二区三区| 亚洲人午夜射精精品日韩| 亚洲日韩中文字幕在线播放| 亚洲av午夜福利精品一区| 久久精品国产亚洲av水果派| 亚洲啪啪免费视频| 亚洲久热无码av中文字幕| 国产精品亚洲一区二区三区| 国产日产亚洲系列最新| 亚洲AV无码乱码国产麻豆穿越 | 亚洲成综合人影院在院播放| 亚洲欧洲无卡二区视頻| 国产91成人精品亚洲精品| 亚洲精品国产精品乱码在线观看 | 在线精品自拍亚洲第一区|