3

在 DWARF2 调试格式中,借助 .debug_frame 部分中的 CFI(调用帧信息)支持堆栈展开。这正是一个表格,它为每个寄存器在前一帧中获取其值保留了一条规则。但是,所有这些规则都依赖于寄存器保存在堆栈中某个位置的事实。当没有帧指针时,这对于在前一帧寄存器中获取堆栈指针的值是不正确的。在这种情况下,堆栈指针可能不会保存在堆栈上,而只是通过递增和递减其值来管理。但是,在 dwarf2(或一般的 dwarf 格式)中没有办法表明寄存器值是其当前值的表达式。所以,我的问题是,如何在使用 dwarf2 调试格式的堆栈展开期间获取堆栈指针的值(当没有帧指针时)。

-BV

4

3 回答 3

2

对于这种情况,dwarf3 似乎支持 DW_CFA_val_offset 。因此,这可用于根据当前值的算术表达式记录前一帧的 SP 值。另一种可能的解决方案是将堆栈指针保存在堆栈本身上(适用于 dwarf2)。这可以在代码效率不那么重要的 -O0 优化级别上完成。

于 2011-03-15T10:37:18.780 回答
0

请参阅有关您的问题的讨论。我不确定这些提案是否已成为当前标准。

于 2011-02-23T21:09:11.710 回答
0

我参加了这个讨论。但是,只是想知道是否有人尝试过通过其他方式解决它。我能想到的一种方法是在堆栈本身上不必要地保存堆栈指针。然后使用这个位置来获取前一帧的 sp 值。

于 2011-02-25T10:08:51.073 回答