温馨提示×

Rust如何在Debian中进行调试

小樊
36
2025-12-09 02:51:00
栏目: 编程语言

在 Debian 上调试 Rust 的实用指南

一 环境准备

  • 安装 Rust 工具链(推荐 rustup):
    • 执行:curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    • 使能工具链:source $HOME/.cargo/env
  • 安装调试器与 Rust 增强组件:
    • sudo apt update && sudo apt install gdb lldb
    • rustup component add rust-src llvm-tools-preview
  • 建议始终使用 debug 构建 进行调试(默认不带优化,便于断点与变量查看):cargo buildcargo run

二 使用 GDB 或 LLDB 命令行调试

  • 启动调试会话:
    • GDB:rust-gdb target/debug/your_program
    • LLDB:rust-lldb target/debug/your_program
  • 常用调试命令(GDB 与 LLDB 命令相近):
    • 断点:break mainbreak your_crate::your_function
    • 继续执行:continue
    • 单步步入/步过:step / next
    • 打印变量:print variable_name
    • 查看调用栈:backtrace(缩写 bt
    • 条件断点:break your_function if variable_name == 42
  • 崩溃时获取回溯:
    • 运行前导出:RUST_BACKTRACE=1 cargo run
    • 或运行后:RUST_BACKTRACE=1 ./target/debug/your_program
  • 提示:若需调试已运行进程,可用 gdb -p <PID> 附加。

三 使用 VS Code 进行图形化调试

  • 安装扩展:
    • rust-analyzer(语言支持)
    • CodeLLDB(调试器)
  • 配置 .vscode/launch.json(示例,使用 GDB):
    • your_program_name 替换为实际二进制名(Cargo 默认与 crate 同名)
    • 示例:
      {
        "version": "0.2.0",
        "configurations": [
          {
            "type": "cppdbg",
            "request": "launch",
            "name": "Debug",
            "program": "${workspaceFolder}/target/debug/your_program_name",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb",
            "setupCommands": [
              {
                "description": "Enable pretty-printing for gdb",
                "text": "-enable-pretty-printing",
                "ignoreFailures": true
              }
            ],
            "preLaunchTask": "cargo build"
          }
        ]
      }
      
  • 如需在启动前自动构建,可添加 .vscode/tasks.jsoncargo build 任务(label 与 preLaunchTask 一致)。

四 辅助工具与技巧

  • 快速打印与日志:
    • println!("{:?}", value)println!("{:#?}", value)(需 #[derive(Debug)]
    • dbg!(value) 快速输出值与位置
    • 使用 log + env_logger 并运行:RUST_LOG=info cargo run
  • 系统/库调用跟踪:
    • 系统调用:strace -p <PID>strace -e trace=open,read,write -p <PID>
    • 库函数调用:ltrace -p <PID>
  • 内存错误与泄漏检测:
    • Valgrind:sudo apt install valgrind,运行:valgrind --tool=memcheck target/debug/your_program
  • 自动重建与运行(便于迭代调试):
    • cargo install cargo-watch
    • cargo watch -x run
  • 提示:Valgrind 对 jemalloc 等自定义分配器支持有限,必要时在 Cargo.toml[profile.dev] 中使用标准库分配器进行对比排查。

五 打包与发布时的调试符号处理

  • 在发布包中保留调试符号,便于后续 gdb/lldb 分析:
    • 方法一:在 Cargo.toml 中启用 release 调试信息
      [profile.release]
      debug = true
      
    • 方法二:使用 cargo-deb 将调试符号分离打包
      • 安装:cargo install cargo-deb
      • 构建:cargo deb --separate-debug-symbols
  • 说明:默认情况下,cargo deb 打包的二进制会剥离调试符号,分离后更易在调试环境中使用。

0