一、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