在上一部分我们进修了关于 DWARF 的信息,以及它若何被用于攫取变量和将被履行的机械码与我们的高等说话的源码接洽起来。在这一部分,我们将进入实践,实现一些我们调试器后面会应用的 DWARF 原语。我们也会应用这个机会,使我们的调试器可以在射一一个断点时打印出当前的源码高低文。
系列文┞仿索引
跟着后面文┞仿的宣布,这些链接会逐渐生效。
- 预备情况
- 断点
- 存放器和内存
- Elves 和 dwarves
- 源码和旌旗灯号
- 源码级慢慢履行
- 源码级断点
- 调用栈展开
- 攫取变量
- 下一步
设置我们的 DWARF 解析器
正如我在这系列文┞仿开端时备注的,我们会应用 libelfin 来处理我们的 DWARF 信息。欲望你已经在第一部分设置好了这些,如不雅没有的话,如今做吧,确保你应用我仓库的 fbreg 分支。
一旦你构建好了 libelfin,就可以把它添加到我们的调试器。第一步是解析我们的 ELF 可履行法度榜样并大年夜中提取 DWARF 信息。应用 libelfin 可以随便马虎实现,只须要对调试器作以下更改:
- siginfo_t {
- int si_signo; /* 旌旗灯号编号 */
- int si_errno; /* errno 值 */
- int si_code; /* 旌旗灯号代码 */
- int si_trapno; /* 导致生成硬件旌旗灯号的陷阱编号
- (大年夜部分架构中都没有应用) */
- pid_t si_pid; /* 发送旌旗灯号的过程 ID */
- uid_t si_uid; /* 发送旌旗灯号过程的用户 ID */
- int si_status; /* 退出值或旌旗灯号 */
- clock_t si_utime; /* 消费的用户时光 */
- clock_t si_stime; /* 消费的体系时光 */
- sigval_t si_value; /* 旌旗灯号值 */
- int si_int; /* POSIX.1b 旌旗灯号 */
- void *si_ptr; /* POSIX.1b 旌旗灯号 */
- int si_overrun; /* 急鹞鲼 overrun 计数;
- POSIX.1b 急鹞鲼 */
- int si_timerid; /* 急鹞鲼 ID; POSIX.1b 急鹞鲼 */
- void *si_addr; /* 导致缺点的内存地址 */
- long si_band; /* Band event (在 glibc 2.3.2 和之前版本中是 int
推荐阅读
概述秦人不暇自哀,而后人哀之;后人哀之而不鉴之,亦使后人而复哀后人也! –论面向文档编程的重要性如不雅想看见识一小我写代码的功力,注释其实是区分老司机和小鲜肉的一个明显的分界线(有没有不雅察碘晾髑公司的>>>详细阅读
地址:http://www.17bianji.com/lsqh/36965.html
1/2 1