Debugger 和 Debug Symbol 简述(Rust 和 C 系)
本文最后更新于 2023年7月30日 上午
本文主要讲 Debugger 和 Debug symbol 的基础.
Rust 的 Debug 支持探索
什么是 Debugger
Debugger 程序用于测试或调试另外一个程序. 如果要从头实现一个语言的 debug 会比较困难, 但如果利用现有的 GDB 或 LLDB 扩展出支持则相对容易些, Rust 也选择的这条路线.
什么是 DWARF
DWARF 是一种调试文件格式, 用在许多编译器和调试器中从而支持源代码级别的调试. DWARF 独立于机器架构, 可用于任意处理器及任意操作系统.
DWARF 读取器时一个程序, 用于处理 DWARF 格式并创建调试器兼容的输出. 编译器一般都内置 DWARF 读取器, DWARF 使用名为”调试信息入口”(DIE)的数据结构, 将信息存放为 “tag” 的形式, 比如变量信息 DW_TAG_variable
, DW_TAG_pointer_type
, 函数信息 DW_TAG_subprogram
等, 同时支持自定义的 tag 和属性.
Windows 平台的 CodeView/PDB
PDB 即程序数据库, 是一种微软创建的文件格式, 包含 debug 信息. PDB 能够被 WinDbg/CDB 等工具使用并展示调试信息. 在一个 PDB 中包含许多的流, 用于描述特定二进制文件中的调试信息, 比如类型/符号/源文件等. CodeView 是另外一种格式, 用于描述符号记录, 和 PDB 的流类似.
支持调试 Rust 的调试器
GDB
rust-gdb rust-lldb 两个 wrapper 可以做到很多功能.
在终端调试 Rust 的 Test
1 |
|
后面的路径为运行 test 时候打印的那一串东西.
运行测试时:
1 |
|
后面是测试的名字.
需要查看打印信息, 则:
1 |
|
1 |
|
如果需要下载东西, y 即可.
debug 时:
1 |
|
GDB 的使用
先看看 Gui 的使用, 因为比较简单, 这里使用基于浏览器的 gdbgui: https://www.gdbgui.com/installation/
安装时有个命令比较给力: python3 -m userpath append ~/.local/bin
, 利用它可以很容易添加某个 Path 到用户 path 中, 比手动来得直接.
但 Fedora 上目前还无法直接安装, 暂时先放下, 用命令行的来.
一些有用的命令
- 使用类似
rust-gdb target/debug/deps/rffd-55c924480ed281a1
来加载调试单元测试 r 测试函数名称
: 来运行特定单元测试r --test
: 开始运行所有单元测试layout src
: 源码模式展示layout split
: 源码 + 汇编展示CTRL+X a
: 退出 layoutCTRL+L
: 完整刷新 layoutn
: 下一步s
: 进入c
: 继续b get_chip
: 添加断点到函数b nested.rs:22
: 添加断点到代码行info b
: 查看断点info locals
: 本地变量info args
: 函数参数info functions
: 打印所有函数p
和po
display xx
: 用于每次步进都打印对应变量f
: 查看当前栈帧信息watch some_person.age
: 观察某个变量值改变并暂停set some_person.age = 22
: 手动修改变量值
gdb 的 info 命令查看符号表的详细文档: https://developer.apple.com/library/archive/documentation/DeveloperTools/gdb/gdb/gdb_14.html
gdb dashboard 非常简单易用: https://github.com/cyrus-and/gdb-dashboard, 使用它结合 vscode 后的打印信息.
参考
- https://rustc-dev-guide.rust-lang.org/debugging-support-in-rustc.html
- https://blog.logrocket.com/debugging-rust-apps-with-gdb/
- https://bitshifter.github.io/rr+rust/index.html#20
- https://rr-project.org/
- https://github.com/rr-debugger/rr
- https://users.rust-lang.org/t/running-a-single-test-under-a-debugger/44460
- https://dev.to/bmatcuk/debugging-rust-with-rust-lldb-j1f
- https://whamcloud.github.io/Online-Help/docs/Contributor_Docs/cd_Debugging_Rust_Tests.html