ZHCADC5A June 2013 – June 2020
调试器需要能够在函数执行过程中查看和修改任何函数的局部变量。
DWARF3 通过让编译器跟踪函数存储数据的位置(在寄存器或堆栈中)来实现这一点。编译器使用 DWARF3 标准第 6.4 节中指定的字节编码语言对这些信息进行编码。这使得调试器可以通过解释字节编码语言来逐渐重新创建以前的状态。每个函数激活由一个基址(称为规范栈帧地址 (Canonical Frame address, CFA))以及一组与激活期间机器寄存器内容相对应的值表示。只要提供激活执行进行到的点,调试器就可以找出所有函数数据所在的位置,并将堆栈展开到先前的状态,包括先前的函数激活。
DWARF3 标准建议使用一个非常大的展开表,每个代码地址一行,每个寄存器一列(虚拟或非虚拟,包括 CFA)。每节单元格包含该寄存器在该时间点(代码地址)的展开指令。
CFA 的定义和构成状态的寄存器组都特定于架构。
寄存器组包括表 10-1 中列出的所有寄存器,按第一列中的 DWARF 寄存器编号索引。
对于 CFA,MSP430 ABI 遵循 DWARF3 标准中建议的约定,将其定义为(调用过程的)先前帧中的调用点处 SP 的值 (R1)。
展开表可能包括并非所有 MSP430 ISA 上都存在的寄存器。因此,可能会出现这样的情况:执行程序的 ISA 具有调用帧信息中未提到的寄存器。在这种情况下,解释器的行为方式应该如下: