堆棧-debugging神器gdb

一、gdb是什麼

GDB 是 GNU Project Debugger 的縮寫,是一款強大的命令行調試工具,支持多種編程語言,如C、C++、Objective-C、Pascal等等,常用於軟體開發和調試。它可以讓程序在運行時停下來,檢查程序的狀態,以及變數的值,控制程序的運行和內存的使用。

二、堆棧的作用與調試

堆是一個保存在電腦內存(RAM)中的一塊區域,程序運行時,需要時刻對堆中的內存進行分配和釋放,如果分配和釋放的不當,會導致內存出現一系列問題,如野指針、內存泄露等。堆棧是一種用於解決內存問題的機制。在函數調用時,每個函數都有一個堆棧幀(Stack Frame)用於保存程序狀態,參數和變數。當函數調用結束時,堆棧幀就會被銷毀,返回到調用該函數的幀中繼續執行。在進行程序調試時,堆棧的信息對於找到問題具有很大的幫助。

三、使用gdb查看堆棧

1.設置堆棧跟蹤

使用 gdb 調試程序時,可以設置堆棧跟蹤,以便更好的查看和分析在程序中發生的錯誤。 在 gdb 命令行中使用 command 命令,加上 bt 參數,就可以打開堆棧跟蹤功能。更多的堆棧選項可以使用 help backtrace 命令來查看。例如:

(gdb) command 1
>bt
>end

2.查看堆棧信息

調試程序時,常常需要查看堆棧信息以幫助判斷問題。在 gdb 命令行中,使用 bt (backtrace)命令可以列印出當前進程的堆棧信息。指定參數 n 表示列印最近的 n 次調用,不指定參數則表示列印所有調用。例如:

(gdb) bt 5
#0 0x00000000004011d6 in main () at test.c:5
#1 0x00000000004011c0 in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
#2 0x00000000004010c9 in _start ()
#3 0x0000000000000000 in ?? ()

3.查看局部變數

在 gdb 命令行中,還可以查看當前所在堆棧幀中的局部變數信息。使用命令 frame n (n 為框架的編號) 可以切換到指定堆棧幀中。使用 info locals 命令可以查看當前堆棧幀中的局部變數信息。例如:

(gdb) frame 1
#1  0x08048408 in func2 () at test.c:10
10            int n = 0;
(gdb) info locals
n = 0

4.設置斷點和跟蹤變數

除了上述堆棧命令,gdb 還提供了設置斷點和跟蹤變數的功能。使用 command 命令,以及 breakpoint 和 watchpoint 命令可以通過條件語句來定義在滿足條件時停止程序執行,同時記錄一些關鍵變數的值。例如:

(gdb) break func1 if n > 10
(gdb) watch n
(gdb) backtrace
#0 func1 (n=11) at test.c:5
#1 0x08048436 in main () at test.c:17

5.使用gdb調試堆溢出問題

堆棧問題經常是程序運行時出現的問題。在堆棧溢出的情況下,我們可以使用 gdb 通過查看堆棧信息,找出問題所在,並調試解決問題。例如:

int main () {
    char *p = malloc(8);
    strcpy(p, "123456");
    printf("%s", p);
    return 0;
}

在程序運行時,當 strcpy 拷貝超過 8 位元組時,將會導致堆棧溢出問題。使用 gdb 進行調試,一步一步跟蹤並查看堆棧信息,可以找到這個問題的根源。例如:

(gdb) run
Starting program: /root/test 
[New Thread 2247]
[New Thread 2248]
123456Program received signal SIGSEGV, Segmentation fault.
__strcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:294
294     ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: No such file or directory.
(gdb) bt
#0  __strcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:294
#1  0x000000000040117b in main () at test.c:7

6、使用Core Dump 進行Debug

GDB 還支持使用 Core Dump 進行調試,Core Dump 是指在程序運行崩潰時會產生一份程序內存快照,並將其寫到磁碟上。當需要對程序進行調試時,可以將 Core Dump 文件載入到 GDB 中來分析。
為了啟用 Core Dump,需要先執行以下命令:

  • ulimit -c unlimited:該命令設置可以生成無限量的 Core Dump 文件
  • echo “/var/core.%p.%u.%h.%t” > /proc/sys/kernel/core_pattern
  • sysctl -w kernel.core_uses_pid=1,以 PID 來區分 Dump 文件

Core Dump 文件生成後,使用以下命令載入並分析 Core Dump 文件:

gdb  

四、小結

使用 gdb 查看堆棧可以有效的檢測到堆棧溢出問題,同時也對程序中的其他問題解決具有幫助,gdb 是一個強大的調試工具,掌握其使用方法能夠大大提高程序員的調試效率。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/259593.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-15 16:29
下一篇 2024-12-15 16:29

相關推薦

  • JFXtras樣式——美化JavaFX應用的必備神器

    本文將從多個方面對JFXtras樣式進行詳細的闡述,教你如何使用JFXtras樣式來美化你的JavaFX應用。無需任何前置知識,讓我們一步步來了解。 一、簡介 JFXtras是一個…

    編程 2025-04-27
  • Matlab局部放大——圖像處理的神器

    一、什麼是Matlab局部放大? Matlab是一個高級技術計算語言和互動式環境,常被用來進行科學計算和工程設計等領域的計算和可視化操作。局部放大指對一張圖像或視頻中感興趣的區域進…

    編程 2025-04-25
  • Debug神器-QDebug

    QDebug是Qt中一個強大的調試工具,它可以將各種數據類型和信息列印到控制台或其他輸出流中。當我們使用Qt進行開發時,有人會說我們可以使用Visual Studio等IDE的調試…

    編程 2025-04-25
  • Vuedatav:數據可視化神器

    在開發的過程中,數據可視化是非常重要的一部分。Vuedatav作為一款開源的數據可視化工具,可以幫助我們快速、簡單、美觀地展示數據,並且功能非常強大。本文將從多個方面進行詳細闡述V…

    編程 2025-04-24
  • 深入了解限流神器 Ratelimiter

    一、Ratelimiter 簡介 Ratelimiter 叫做限流器,顧名思義,就是用來對請求進行限流的一個工具。它可以限制每個介面允許的請求次數、時間範圍等,以防止伺服器被惡意攻…

    編程 2025-04-23
  • Codediff——提高代碼變更質量的神器

    一、Codediff是什麼意思 Codediff是指代碼差異比較,它可以實現兩個代碼文件之間的文件夾、文件、類、方法、行差異比較,精準地捕捉代碼變更。它可以幫助開發人員快速定位問題…

    編程 2025-04-23
  • NetMQ:分散式消息處理的輕量級神器

    一、NetMQ簡介 NetMQ是一個快速、輕量級的消息處理庫,它完全基於C#實現,使用ZeroMQ的核心技術來提供可靠的消息傳遞和非同步I/O操作。相對於其他的消息處理庫,NetMQ…

    編程 2025-04-23
  • ideaiu——編程中的全能神器

    一、從ideaIU下載 要使用ideaiu,當然首先需要下載並安裝ideaIU。 前往官網https://www.jetbrains.com/idea/download/ 選擇對應…

    編程 2025-04-23
  • 造數據工具:提高開發效率的神器

    在現代繁忙的開發環境中,快速準確地生成數據至關重要。這就是為什麼造數據工具是如此重要的原因。這篇文章將從多個角度探討造數據工具如何為開發工程師提供幫助和提高他們的效率。 一、造數據…

    編程 2025-04-22
  • JsFiddle:用於web開發的代碼協作神器

    一、方便的代碼編輯器 JsFiddle是一個基於瀏覽器的代碼編輯器,它提供了HTML、CSS、JavaScript的編輯界面,也提供了一個實時的預覽窗口以及一個console窗口,…

    編程 2025-04-20

發表回復

登錄後才能評論