gpt4 book ai didi

gcc - 执行步骤,矮人

转载 作者:行者123 更新时间:2023-12-04 21:04:06 27 4
gpt4 key购买 nike

我正在研究源级调试器。 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调用时,栈帧基地址会发生变化,表明我们应该停止。这给了我们以下行为:
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 来决定调用何时真正返回到原始帧;还有其他并发症。

值得思考一下如何处理函数的内联实例(DWARF 确实对此进行了描述)。但这对于这个问题来说有点多。

不是要阻止实验,但如果我要开始调试器项目,我会想看看 Apple 正在进行的调试器, lldb ,这是开源的。

关于gcc - 执行步骤,矮人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3223830/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com