gdb如何在函数返回处下断点

·

使用finish命令

先进入目标函数内部(通过step命令),然后执行finish命令,程序会运行至当前函数返回前暂停。该方法适用于已进入函数内部的情况

使用 until 命令

until 命令会让程序运行到当前行之后的某一行或当前循环体之外。

如果你在函数的某一行,想让它运行到函数末尾(假设末尾是 }),可以: gdb 编辑 (gdb) until 或者指定大括号所在的行号: gdb 编辑 (gdb) until 90 # 假设 } 在第90行

程序启动后直接暂停

use std::env;
use std::process;
use std::ffi::CString;

fn wait_for_gdb() {
    unsafe {
        // 打印 PID,方便 attach
        let pid = libc::getpid();
        println!("PID: {} waiting for gdb...", pid);

        // 主动给自己发 SIGSTOP
        libc::raise(libc::SIGSTOP);
    }
}

fn main() {
    // 可选:通过环境变量控制,只有在需要调试时才挂起
    if env::var("WAIT_GDB").is_ok() {
        wait_for_gdb();
    }

    println!("Program resumed!");
    // 你的正常逻辑
    for i in 0..5 {
        println!("i = {}", i);
        std::thread::sleep(std::time::Duration::from_secs(1));
    }
}

使用gdb record 查看退出原因

# 1. 启动 GDB
gdb target/debug/your_program

# 2. 设置环境变量(可选但推荐)
(gdb) set environment RUST_BACKTRACE=1
(gdb) set environment RUST_LOG=debug  # 如果使用日志
# 如果程序运行时间很长,设置缓冲区大小
(gdb) set record full stop-at-limit on
(gdb) set record full insn-number-max 1000000
# 3. 开始录制
(gdb) record
# 4. 运行程序
(gdb) run

# 查看程序是如何退出的
(gdb) info program
# 查看最后的信号信息
(gdb) info signals
# 查看当前堆栈
(gdb) bt
# 查看退出前的最后几个函数调用
(gdb) reverse-finish
(gdb) reverse-finish
(gdb) reverse-finish
# 或者逐步回退
(gdb) reverse-step
(gdb) reverse-step
# 查看寄存器状态(可能显示段错误原因)
(gdb) info registers
# 查看内存映射
(gdb) info proc mappings

rust 程序调试

# 安装 rust-gdb(如果可用)
rust-gdb target/debug/your_program
# 或者在普通 gdb 中设置
(gdb) break core::panicking::panic
(gdb) break std::sys_common::backtrace::__rust_end_short_backtrace
(gdb) break std::process::exit
# 查看字符串内容(Rust 的 String 和 &str)
(gdb) print your_string_variable
# 查看 Vec 内容
(gdb) print *your_vec_pointer@your_vec_pointer.len
# 查看 Option/Result
(gdb) print your_option.Some

使用 rr 工具回放(推荐替代方案)

# 安装 rr (Ubuntu/Debian)
sudo apt install rr
# 录制程序执行
rr record target/debug/your_program
# 回放并调试
rr replay
# 在 replay 模式下,可以使用所有 reverse debugging 命令
(rr) reverse-continue
(rr) reverse-step
(rr) bt