使用dwarf2进行堆栈展开时获取堆栈指针的值

时间:2011-02-18 10:47:36

标签: stack-unwinding dwarf

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

-bV

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

请参阅this discussion了解您的问题。 我不确定这些提案是否已成为现行标准。

答案 2 :(得分:0)

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