2025年1月24日 星期五

gdb 用法

gdb (GNU Debugger) 是一个强大的调试工具,常用于调试 C、C++ 等程序。它可以帮助你在程序运行时分析、定位和解决各种问题(例如,崩溃、内存错误等)。下面是 gdb 的常见用法和基本操作,帮助你高效调试程序。

1. 启动 gdb

首先,你需要编译你的程序时加上调试信息,通常使用 -g 选项编译代码:

g++ -g -o my_program my_program.cpp

然后,使用 gdb 启动调试:

gdb ./my_program

这将启动 gdb,并加载你的可执行程序。

2. 常用 gdb 命令

1. 设置断点 (Breakpoints)

断点是调试的基础,允许你在程序的某一行暂停执行。

  • 在函数入口设置断点:

    (gdb) break function_name
  • 在源代码的某一行设置断点:

    (gdb) break file.cpp:line_number
  • 在某个条件下设置断点:

    (gdb) break file.cpp:line_number if condition

2. 运行程序 (Run)

  • 启动程序:

    (gdb) run
  • 启动程序并传递参数:

    (gdb) run arg1 arg2

3. 单步调试 (Stepping)

  • 单步执行(进入函数):

    (gdb) step
  • 单步执行(跳过当前函数):

    (gdb) next
  • 跳到函数的返回

    (gdb) finish

4. 查看变量的值

  • 查看变量的值:

    (gdb) print variable_name
  • 查看指针指向的内容:

    (gdb) print *pointer_name
  • 查看当前栈帧的局部变量:

    (gdb) info locals
  • 查看函数的参数:

    (gdb) info args

5. 继续执行 (Continue)

  • 继续执行程序,直到下一个断点:
    (gdb) continue

6. 查看调用栈 (Backtrace)

  • 打印当前的调用栈:

    (gdb) backtrace
  • 打印调用栈的前 n 层:

    (gdb) backtrace n
  • 查看当前栈帧的信息:

    (gdb) info frame

7. 修改变量值

你可以在调试过程中修改变量的值:

  • 修改变量:
    (gdb) set variable variable_name = new_value

8. 退出 gdb

退出 gdb 调试会话:

(gdb) quit

3. 其他常用 gdb 功能

1. 查看源代码

  • 查看当前执行行的源代码:

    (gdb) list
  • 查看指定位置的源代码:

    (gdb) list file.cpp:line_number

2. 观察点 (Watchpoints)

观察点用于监视某个变量的变化。程序会在变量的值发生变化时暂停执行。

  • 设置观察点:
    (gdb) watch variable_name

3. 检查内存 (Memory)

  • 查看某个内存地址的内容:

    (gdb) x/4xw 0xaddress

    其中,4xw 表示以 16 进制格式查看 4 个字(32 位)的内存。

4. 调试崩溃 (Core Dump)

如果程序崩溃并生成了 core dump 文件,你可以通过 gdb 进行调试:

gdb ./my_program core

这将加载程序和崩溃的核心转储文件,你可以使用 backtrace 等命令查看崩溃的位置。

5. 调试多线程程序

  • 查看所有线程:

    (gdb) info threads
  • 切换到某个线程:

    (gdb) thread thread_number
  • 查看当前线程的栈帧:

    (gdb) backtrace

6. 其他有用命令

  • 查看调试信息:打印调试信息(比如变量类型、函数信息等):

    (gdb) info variables
  • 检查符号

    (gdb) info symbol address
  • 查看当前执行行

    (gdb) info line
  • 禁用断点

    (gdb) disable breakpoint_number
  • 删除断点

    (gdb) delete breakpoint_number

7. gdb 脚本

你可以编写 gdb 脚本(以 .gdb.txt 为后缀),并通过 source 命令执行:

(gdb) source my_script.gdb

这允许你自动化调试流程,设置断点、查看变量等。

8.call stack(呼叫堆疊)

顯示 call stack(呼叫堆疊)是一個非常常見且有用的操作,這樣可以查看當前程式的執行流程,知道哪些函數被呼叫過,並且可以追蹤錯誤或程式崩潰時的堆疊情況。

顯示 Call Stack

要顯示 call stack,在 GDB 中使用 backtrace 命令(簡寫為 bt)。這個命令會列出所有目前的堆疊框架,即從程式的當前執行點到主程式的呼叫歷程。

步驟:

  1. 啟動 GDB 並加載你的程式:

    gdb ./your_program
  2. 在 GDB 中設置斷點並運行程式:

    (gdb) break main
    (gdb) run
  3. 當程式停在斷點或發生崩潰時,輸入以下命令來顯示 call stack:

    (gdb) backtrace

    或者你也可以使用簡寫:

    (gdb) bt

這將顯示當前的呼叫堆疊,像這樣:

#0 0x00400556 in function_name () at source_file.cpp:line_number
#1 0x004004a7 in another_function () at source_file.cpp:line_number #2 0x0040045f in main () at main.cpp:line_number

每一行表示一個堆疊框架,從當前執行的函數到最初的 main() 函數。

進階使用

  • 顯示更詳細的堆疊信息:你可以使用 backtrace full 來顯示更多的本地變數資料:

    (gdb) backtrace full
  • 查看特定層級的呼叫堆疊:如果你只對某一層的堆疊信息感興趣,可以指定顯示的層數:

    (gdb) bt 10

    這會顯示最近 10 層的堆疊框架。

  • 顯示單一堆疊層級的詳情:你可以查看特定層級的詳細資料,例如:

    (gdb) frame 3

    這會顯示第四層(堆疊的深度從 0 開始)的詳細資料。

  • 檢視局部變數:在查看堆疊的同時,你也可以檢視當前層級的變數:

    (gdb) info locals

沒有留言:

張貼留言