作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究源级调试器。 elf 中可用的调试信息
格式。如何实现“跨步”?
问题是在'Point1',无论如何我可以等待
下一个源代码行(从 .debug_line 表中读取)。
谢谢
if (a == 1)
x = 1; //Point1
else if (a == 2)
x = 1;
z = 1;
最佳答案
我不确定我是否完全理解这个问题,但我可以告诉你 GDB 如何实现它的 step
命令。
一旦控制进入特定的编译单元,GDB 就会读取该 CU 的调试信息;特别是,它读取 .debug_line 部分的 CU 部分并构建一个将指令地址映射到源代码位置的表。
当step
开始,GDB 查找当前 PC 的源位置。然后按照机器指令,每次查找新PC的源位置,直到源位置发生变化。当源位置改变时,step
已完成。
它还在每一步之后计算帧 ID——堆栈帧的基地址和函数的起始地址,并检查它是否已经改变。如果是,则意味着我们已经进入或从递归调用中返回,并且 step
已完成。
要了解为什么需要检查帧 ID 以及源位置,请考虑逐步调用以下函数:
int fact(n) { if (n > 0) { return n * fact(n-1); } else return 1; }
fact (n=10) at recurse.c:4
(gdb) step
fact (n=9) at recurse.c:4
(gdb) step
fact (n=8) at recurse.c:4
next
command 将这种一般行为与适当的逻辑相结合,以识别函数调用并让它们返回到完成状态。和以前一样,必须使用帧 ID 来决定调用何时真正返回到原始帧;还有其他并发症。
关于gcc - 执行步骤,矮人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3223830/
我正在研究源级调试器。 elf 中可用的调试信息 格式。如何实现“跨步”? 问题是在'Point1',无论如何我可以等待 下一个源代码行(从 .debug_line 表中读取)。 谢谢 if (a =
我正在用 nasm 编写一种汇编级人类可说的编程语言。我注意到 Dwarf 调试是开发它的重要组成部分。 为了让它以后成为自托管,不仅要编译成 ELF,还要支持 Dwarf 以进行调试。对于 ELF,
我是一名优秀的程序员,十分优秀!