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
rust-gdb target/debug/deps/rffd-55c924480ed281a1

后面的路径为运行 test 时候打印的那一串东西.

运行测试时:

1
r test_start_scan

后面是测试的名字.

需要查看打印信息, 则:

1
--nocapture
1
To make this setting permanent, add 'set debuginfod enabled on' to .gdbinit.

如果需要下载东西, y 即可.

debug 时:

1
2
b lib.rs:533
run --test

GDB 的使用

先看看 Gui 的使用, 因为比较简单, 这里使用基于浏览器的 gdbgui: https://www.gdbgui.com/installation/

安装时有个命令比较给力: python3 -m userpath append ~/.local/bin, 利用它可以很容易添加某个 Path 到用户 path 中, 比手动来得直接.

但 Fedora 上目前还无法直接安装, 暂时先放下, 用命令行的来.

一些有用的命令

  1. 使用类似 rust-gdb target/debug/deps/rffd-55c924480ed281a1 来加载调试单元测试
  2. r 测试函数名称: 来运行特定单元测试
  3. r --test: 开始运行所有单元测试
  4. layout src: 源码模式展示
  5. layout split: 源码 + 汇编展示
  6. CTRL+X a: 退出 layout
  7. CTRL+L: 完整刷新 layout
  8. n: 下一步
  9. s: 进入
  10. c: 继续
  11. b get_chip: 添加断点到函数
  12. b nested.rs:22: 添加断点到代码行
  13. info b: 查看断点
  14. info locals: 本地变量
  15. info args: 函数参数
  16. info functions: 打印所有函数
  17. ppo
  18. display xx: 用于每次步进都打印对应变量
  19. f: 查看当前栈帧信息
  20. watch some_person.age: 观察某个变量值改变并暂停
  21. 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 后的打印信息.

参考


Debugger 和 Debug Symbol 简述(Rust 和 C 系)
https://blog.rayy.top/2023/07/30/rust-debug-basics/
作者
貘鸣
发布于
2023年7月30日
许可协议