Rust在Linux系统中如何调试
小樊
39
2025-12-10 09:22:50
Linux下Rust调试全指南
一 快速上手与日志打印
- 使用**println!**输出关键变量与执行流,适合定位简单问题。
- 使用dbg!宏,能同时打印表达式值与文件名:行号,非常适合临时定位:例如:dbg!(&vec![1,2,3]);。
- 使用**debug_assert! / assert_eq!**在开发期做不变式校验,失败即 panic,便于快速发现问题。
- 使用cargo test运行单元测试与集成测试,先以测试缩小问题范围,再进入调试器精确定位。
二 命令行调试器 GDB 与 LLDB
- 构建与启动
- 调试请使用debug构建:cargo build(生成于target/debug/);不要使用默认的 release 构建。
- 使用 Rust 提供的包装器rust-gdb或rust-lldb,其对 Rust 类型与符号更友好:rust-gdb target/debug/your_bin;rust-lldb target/debug/your_bin。
- 常用命令对照
- GDB:break main / run / next / step / print var / backtrace
- LLDB:breakpoint set --name main / run / thread step-over / thread step-in / frame variable / bt
- 实用技巧
- 条件断点:LLDB 示例 breakpoint set -c “half == 3” -f main.rs -l 13 -C bt(命中时自动打印堆栈)。
- 查看复杂值:LLDB 中 frame variable 可直接打印如 Vec、String 等集合内容,便于观察容器状态。
三 IDE 图形化调试 VSCode
- 安装扩展:VSCode 安装rust-analyzer;调试后端可选CodeLLDB(推荐)或 Native Debug。
- 配置 launch.json(CodeLLDB 示例)
- 基本可执行调试
{
“version”: “0.2.0”,
“configurations”: [
{
“type”: “lldb”,
“request”: “launch”,
“name”: “Debug executable”,
“program”: “${workspaceFolder}/target/debug/your_bin”,
“args”: [],
“cwd”: “${workspaceFolder}”
}
]
}
- 使用 Cargo 构建并调试指定二进制
{
“version”: “0.2.0”,
“configurations”: [
{
“type”: “lldb”,
“request”: “launch”,
“name”: “Debug with cargo”,
“cargo”: {
“args”: [“build”, “–bin=your_bin”, “–package=your_pkg”],
“filter”: { “name”: “your_bin”, “kind”: “bin” }
},
“args”: [],
“cwd”: “${workspaceFolder}”
}
]
}
- 要点
- 断点、变量查看、调用栈与表达式求值均可在图形界面完成,适合日常开发与回归定位。
四 系统级与内存问题排查
- 系统调用与库调用跟踪
- 使用strace跟踪系统调用:strace -e trace=open,read,write,close ./your_bin;用于排查文件、网络、权限与 I/O 问题。
- 使用ltrace跟踪动态库调用:ltrace -e ‘malloc,free,printf’ ./your_bin;用于观察库层函数调用与参数。
- 内存错误与泄漏检测
- 使用Valgrind(memcheck)检测非法访问与内存泄漏:valgrind --tool=memcheck target/debug/your_bin。
- 在CentOS/RHEL等发行版上,安装调试工具:sudo yum install gdb lldb;确保调试符号与工具链可用。
五 常见问题与排查清单
- 没有调试符号或源码对不上
- 确认使用cargo build而非 release;可执行文件应在target/debug/;必要时清理后重建:cargo clean && cargo build。
- 断点无法命中或变量不可见
- 优先使用rust-gdb/rust-lldb;在 LLDB 中用 frame variable 检查局部变量;为复杂类型实现或派生Debug以获得可读输出。
- 崩溃无回溯或信息不足
- 在开发配置中开启更详细的回溯:在Cargo.toml的**[profile.dev]**添加 rustflags = [“-Z”, “backtrace”];发布构建不建议开启。
- 附加到已运行进程
- 使用**gdb -p **附加;适合分析服务进程或难以复现的问题。