最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux之GDB調(diào)試詳解

 更新時間:2025年09月10日 14:25:41   作者:zzh_zao  
GDB是開源調(diào)試工具,支持C/C++程序調(diào)試,可暫停執(zhí)行、設(shè)置斷點、查看變量與內(nèi)存,分析崩潰原因,提供運行控制、調(diào)用棧查看、寄存器檢查等功能,適用于多平臺

Linux GDB 調(diào)試

一、初識 GDB

GDB 是一個開源的、功能強大的調(diào)試工具,主要用于調(diào)試 C、C++ 等語言編寫的程序。

它支持多種操作系統(tǒng)和架構(gòu),能夠幫助開發(fā)者在程序運行過程中暫停執(zhí)行、查看變量值、修改程序狀態(tài)等,從而快速定位和修復(fù)問題。

二、啟動 GDB

1. 加載程序

如果你已經(jīng)編譯好了一個程序,可以直接通過以下命令啟動 GDB 并加載程序:

gdb <program>

例如,如果你的程序名為 example,則可以輸入:

gdb example

GDB 會加載該程序,并進入調(diào)試模式。

2. 加載程序與參數(shù)

如果程序需要接收命令行參數(shù),可以使用以下命令啟動 GDB:

gdb <program> --args <args>

例如,程序需要接收一個文件路徑作為參數(shù),可以這樣啟動:

gdb example --args input.txt

在 GDB 中,可以通過 run 命令啟動程序,并傳遞參數(shù)。

3. 加載程序與核心轉(zhuǎn)儲文件

當(dāng)程序崩潰并生成了核心轉(zhuǎn)儲文件時,可以通過以下命令啟動 GDB,加載程序和核心轉(zhuǎn)儲文件進行調(diào)試:

gdb <program> <core>

這可以幫助你分析程序崩潰的原因。

三、設(shè)置斷點

斷點是調(diào)試過程中非常重要的工具,它可以讓程序在指定的位置暫停執(zhí)行,方便我們查看程序狀態(tài)。

1. 在函數(shù)處設(shè)置斷點

如果你知道程序在某個函數(shù)中可能出現(xiàn)問題,可以使用以下命令在該函數(shù)處設(shè)置斷點:

break <function>

例如,設(shè)置在 main 函數(shù)處的斷點:

break main

程序運行到 main 函數(shù)時會暫停。

2. 在文件的指定行設(shè)置斷點

如果你已經(jīng)大致知道問題可能出現(xiàn)在代碼的哪一行,可以使用以下命令在指定文件的指定行設(shè)置斷點:

break <filename>:<line>

例如,設(shè)置在 example.c 文件的第 10 行的斷點:

break example.c:10

程序運行到該行時會暫停。

3. 在指定內(nèi)存地址處設(shè)置斷點

在某些情況下,你可能需要在指定的內(nèi)存地址處設(shè)置斷點,可以使用以下命令:

break *<address>

例如,設(shè)置在內(nèi)存地址 0x1000 處的斷點:

break *0x1000

程序運行到該地址時會暫停。

4. 設(shè)置條件斷點

如果你希望斷點只有在滿足特定條件時才觸發(fā),可以使用以下命令設(shè)置條件斷點:

break <location> if <condition>

例如,設(shè)置在 main 函數(shù)處的斷點,只有當(dāng)變量 x 的值大于 10 時才觸發(fā):

break main if x > 10

這樣可以更精準(zhǔn)地定位問題。

四、運行和停止程序

1. 開始運行程序

在 GDB 中,可以通過以下命令開始運行程序:

run <args>

如果你在啟動 GDB 時已經(jīng)指定了程序參數(shù),可以直接輸入 run;如果沒有指定參數(shù),可以在 run 命令后添加參數(shù)。

例如:

run

或者:

run input.txt

程序會從頭開始運行,直到遇到斷點。

2. 從斷點繼續(xù)運行

當(dāng)程序在斷點處暫停后,可以通過以下命令從當(dāng)前斷點繼續(xù)運行:

continue

程序會繼續(xù)執(zhí)行,直到遇到下一個斷點。

3. 單步執(zhí)行

在調(diào)試過程中,有時需要逐條語句查看程序的執(zhí)行情況,可以使用以下命令:

  • next:執(zhí)行下一條語句,但不會進入函數(shù)內(nèi)部。如果當(dāng)前語句是一個函數(shù)調(diào)用,它會直接跳過該函數(shù),執(zhí)行下一條語句。
next
  • step:執(zhí)行下一條語句,并進入函數(shù)內(nèi)部。如果當(dāng)前語句是一個函數(shù)調(diào)用,它會進入該函數(shù),繼續(xù)逐條語句執(zhí)行。
step

通過這兩種方式,可以靈活地查看程序的執(zhí)行流程。

4. 執(zhí)行完當(dāng)前函數(shù)

如果你當(dāng)前處于一個函數(shù)內(nèi)部,可以通過以下命令執(zhí)行完當(dāng)前函數(shù)并返回:

finish

程序會繼續(xù)執(zhí)行,直到當(dāng)前函數(shù)執(zhí)行完畢并返回。

5. 終止程序運行

在調(diào)試過程中,如果需要終止程序的運行,可以使用以下命令:

kill

程序會被強制終止。

五、查看程序狀態(tài)

1. 查看代碼

在 GDB 中,可以通過以下命令查看當(dāng)前代碼位置附近的代碼:

list

默認(rèn)情況下,它會顯示當(dāng)前代碼位置附近的 10 行代碼。如果需要查看其他部分的代碼,可以在 list 命令后指定文件名和行號:

list <filename>:<line>

例如:

list example.c:20

這可以幫助你快速定位代碼位置。

2. 查看斷點信息

可以通過以下命令查看所有設(shè)置的斷點信息:

info breakpoints

它會列出所有斷點的編號、位置、條件等信息,方便你管理斷點。

3. 查看函數(shù)參數(shù)和局部變量

當(dāng)你處于某個函數(shù)的斷點處時,可以通過以下命令查看當(dāng)前函數(shù)的參數(shù)和局部變量:

  • info args:查看當(dāng)前函數(shù)的參數(shù)。
info args
  • info locals:查看當(dāng)前函數(shù)的局部變量。
info locals

這可以幫助你了解函數(shù)的輸入和內(nèi)部狀態(tài)。

4. 查看寄存器內(nèi)容

在某些情況下,你可能需要查看寄存器的內(nèi)容,可以通過以下命令:

info registers

它會列出所有寄存器的名稱和當(dāng)前值,這對于底層調(diào)試非常有幫助。

5. 查看調(diào)用棧

當(dāng)程序出現(xiàn)異常時,查看調(diào)用棧可以幫助你了解程序的執(zhí)行路徑??梢酝ㄟ^以下命令查看調(diào)用棧:

backtrace

或者簡寫為:

bt

它會從當(dāng)前棧幀開始,向上列出所有調(diào)用棧幀的信息,包括函數(shù)名、文件名、行號等。

6. 切換調(diào)用棧幀

如果你需要查看調(diào)用棧中某個特定棧幀的信息,可以通過以下命令切換到該棧幀:

frame <n>

其中 <n> 是棧幀的編號。例如,切換到編號為 2 的棧幀:

frame 2

然后可以使用 info args、info locals 等命令查看該棧幀的參數(shù)和局部變量。

六、變量和內(nèi)存操作

1. 打印變量值

在調(diào)試過程中,可以通過以下命令打印變量的值:

print <variable>

例如,打印變量 x 的值:

print x

GDB 會顯示變量的當(dāng)前值。

2. 打印內(nèi)存內(nèi)容

如果需要查看內(nèi)存中的內(nèi)容,可以通過以下命令:

x/<n><format><address>
  • <n> 表示要顯示的內(nèi)存單元數(shù)量。
  • <format> 表示顯示格式,例如 x 表示十六進制,d 表示十進制,c 表示字符等。
  • <address> 表示內(nèi)存地址。

例如,查看從地址 0x1000 開始的 10 個字節(jié)的十六進制內(nèi)容:

x/10x 0x1000

這可以幫助你查看內(nèi)存的布局和數(shù)據(jù)。

3. 修改變量值

在某些情況下,你可能需要修改變量的值,可以通過以下命令:

set <variable>=<value>

例如,將變量 x 的值修改為 20:

set x=20

然后可以繼續(xù)運行程序,觀察程序行為的變化。

七、退出 GDB

完成調(diào)試后,可以通過以下命令退出 GDB:

quit

或者:

exit

八、GBD基本命令匯總

啟動 GDB

  • gdb :啟動 GDB 并加載要調(diào)試的程序。
  • gdb :加載程序和核心轉(zhuǎn)儲文件進行調(diào)試。
  • gdb --args :加載程序并傳遞參數(shù)。

設(shè)置斷點

  • break :在指定函數(shù)處設(shè)置斷點。
  • break : :在指定文件的指定行設(shè)置斷點。
  • break *:在指定內(nèi)存地址處設(shè)置斷點。
  • break :設(shè)置條件斷點,只有滿足條件時才會觸發(fā)。

運行和停止

  • run :開始運行程序,并傳遞參數(shù)。
  • continue:從當(dāng)前斷點繼續(xù)運行程序。
  • next:執(zhí)行下一條語句(跳過函數(shù)調(diào)用)。
  • step:進入函數(shù)內(nèi)部執(zhí)行。
  • finish:執(zhí)行完當(dāng)前函數(shù)并返回。
  • kill:終止正在運行的程序。
  • disable breakpoints:指令用于禁用已設(shè)置的斷點。
  • enable breakpoints:指令用于重新啟用之前被禁用的斷點。
  • display 變量名:跟蹤查看一個變量,每次停下來都顯示它的值
  • undisplay:取消對先前設(shè)置的那些變量的跟蹤
  • delete breakpoints:刪除所有斷點
  • set var:修改變量的值
  • delete breakpoints n:刪除序號為n的斷點

查看程序狀態(tài)

  • list:顯示當(dāng)前代碼位置附近的代碼。
  • info breakpoints:顯示所有斷點信息。
  • info args:顯示當(dāng)前函數(shù)的參數(shù)。
  • info locals:顯示當(dāng)前函數(shù)的局部變量。
  • info registers:顯示寄存器的內(nèi)容。
  • backtrace 或 bt:顯示調(diào)用棧。
  • frame :切換到指定的調(diào)用棧幀。

變量和內(nèi)存操作

  • print :打印變量的值。
  • print *:打印指定地址的內(nèi)容。
  • set =:修改變量的值。
  • x/:查看內(nèi)存內(nèi)容,例如 x/10gx 0x1000 查看 10 個 8 字節(jié)的內(nèi)容。

信號處理

  • handle stop:讓 GDB 在接收到指定信號時暫停程序。
  • handle nostop:讓 GDB 不在接收到指定信號時暫停程序。

退出 GDB

  • quit 或 exit:退出 GDB。

其他

  • help:顯示幫助信息。
  • help :顯示指定命令的幫助信息。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • linux下scp和sftp命令使用詳解

    linux下scp和sftp命令使用詳解

    大家好,本篇文章主要講的是linux下scp和sftp命令使用詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Linux網(wǎng)絡(luò)配置之FTP配置詳細(xì)教學(xué)

    Linux網(wǎng)絡(luò)配置之FTP配置詳細(xì)教學(xué)

    這篇文章主要為大家詳細(xì)介紹了Linux網(wǎng)絡(luò)配置中FTP配置的相關(guān)知識,文中的示例代碼簡潔易懂,具有一定的借鑒價值,有需要的小伙伴可以了解下
    2025-06-06
  • Linux系統(tǒng)下SSD磁盤識別方法詳解

    Linux系統(tǒng)下SSD磁盤識別方法詳解

    在當(dāng)今數(shù)據(jù)驅(qū)動的時代,存儲介質(zhì)的選擇直接影響著系統(tǒng)性能,固態(tài)硬盤(SSD)以其卓越的 I/O 性能逐漸取代傳統(tǒng)機械硬盤(HDD),成為服務(wù)器和高端工作站的標(biāo)配,本文給大家介紹了Linux系統(tǒng)下SSD磁盤識別方法,需要的朋友可以參考下
    2025-05-05
  • Linux服務(wù)器配置DNS的完整指南

    Linux服務(wù)器配置DNS的完整指南

    這篇文章主要為大家詳細(xì)介紹了Linux服務(wù)器配置DNS的相關(guān)知識,適用CentOS 7, 銀河麒麟 V10, 以及其他使用 NetworkManager 管理網(wǎng)絡(luò)的 Linux 發(fā)行版,感興趣的小伙伴可以了解下
    2026-02-02
  • linux cpu如何開啟性能模式

    linux cpu如何開啟性能模式

    這篇文章主要介紹了linux cpu如何開啟性能模式問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 優(yōu)化Apache服務(wù)器性能的方法小結(jié)

    優(yōu)化Apache服務(wù)器性能的方法小結(jié)

    盡管Apache是一個高可定制的功能強大且相當(dāng)復(fù)雜的服務(wù)器軟件,我們很有興趣的注意到即使是Apache的標(biāo)準(zhǔn)安裝也可以得到不錯的性能。
    2010-12-12
  • 在centos7上搭建mysql主從服務(wù)器的方法(圖文教程)

    在centos7上搭建mysql主從服務(wù)器的方法(圖文教程)

    這篇文章主要介紹了在centos7上搭建mysql主從服務(wù)器的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • ubuntu18.0.4安裝mysql并解決ERROR 1698 (28000): Access denied for user ''''root''''@''''localhost''''

    ubuntu18.0.4安裝mysql并解決ERROR 1698 (28000): Access denied for

    這篇文章主要介紹了ubuntu18.0.4安裝mysql并解決ERROR 1698 (28000): Access denied for user 'root'@'localhost',現(xiàn)在將ubuntu18.0.4上安裝mysql并將碰到的問題記錄下來,感興趣的朋友一起看看吧
    2019-11-11
  • 如何設(shè)置vim永久顯示行號

    如何設(shè)置vim永久顯示行號

    在Linux環(huán)境下,vim默認(rèn)不顯示行號,這在程序編譯出錯時定位錯誤語句非常不便,通過修改vim配置文件vimrc,可以在每次打開vim時永久顯示行號
    2025-01-01
  • linux中使用grep命令詳解

    linux中使用grep命令詳解

    在本篇文章里小編給大家整理了關(guān)于linux中使用grep命令的相關(guān)知識點內(nèi)容,需要的朋友們跟著學(xué)習(xí)下。
    2019-03-03

最新評論

依安县| 迁西县| 甘孜县| 镶黄旗| 高唐县| 神农架林区| 秦皇岛市| 昌平区| 平乡县| 新乐市| 临汾市| 贵德县| 乌拉特前旗| 仁怀市| 广昌县| 固阳县| 安宁市| 广丰县| 游戏| 临高县| 安义县| 阳谷县| 基隆市| 德钦县| 富锦市| 青神县| 灵石县| 诏安县| 且末县| 南溪县| 延边| 新邵县| 长顺县| 长岭县| 樟树市| 高陵县| 宝坻区| 栾川县| 英吉沙县| 江达县| 石楼县|