This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] C2000-CGT:C28x DWARF RA@CFA+0 中断链式展开

Guru**** 2860510 points

Other Parts Discussed in Thread: C2000-CGT

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1633982/c2000-cgt-c28x-dwarf-ra-cfa-0-breaks-chained-unwinding

器件型号: C2000-CGT

C28x .debug_frame 在 CFA+0 处对 RA 进行编码、这违反 DWARF 规范§6.4.1。  
CFA 必须标识调用方帧基址、而不是 RA 位置。 这会破坏链接展开:

标准: CFA = CALLER_SP、RA = CFA+OFFSET  
C28x:   CFA = R20-N、  RA = CFA+0→CALLER_SP 错误

下一帧查找使用不正确的 SP、将堆栈重建中断到 1 级以上。

RA@CFA+0 是否有意为 C28x 行为?

当 RA 为 CFA+0 时、解压器应如何计算真正的调用方 SP?

我们能否获得这一 DWARF 实施的正式文件?

这可以防止在外部调试器中进行可靠的多帧回溯。 标准 DWARF 工具完全失败。

我目前使用我们现有的经改编的 DWARF 读取工具、但我们只能获取部分调用栈。  

使用 C2000_CGT_22_6_2

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Robert:

    没有 专门针对 DWARF 执行情况的正式文件。  现有实现已在编译器中使用多年、遵守 C28x 堆栈和调用约定。  请注意、我们支持 TI Code Composer Studio (CCS)、但我们不声称支持“外部调试器“、因此 CCS 可能会错过 DWARF 中的某些内容而不会出现任何问题。  您的“改编后的 DWARF 读取工具“我们无能为力、但如果您发现使用更标准的工具或在 CCS 或 TI 工具中也有相同的行为、我们可以仔细研究。

    为确保我们位于同一页面、您能否提供您参考的预处理测试案例?  请按照 如何提交编译器测试用例一文中的说明 操作、同时确保包含您的构建选项。

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Alan、
    在准备测试案例时、我能够识别出差异、呼叫堆栈现在可以正常工作。
    不同之处在于返回地址的 FDE 规则。
    CIE 正确地指示返回地址是从寄存器 26(RPC 寄存器)获取的。  
    但是、FDE 指定应通过偏移为 0x00 的 CFA 计算返回地址。
    此规则似乎在 我 使用 C2000-CGT 构建的应用程序的所有 FDE 条目中始终使用。
    常规 DWARF 将跳过此规则、因为该规则已包含在 CIE 中。
    作为一种解决方法、我忽略了 FDE 条目的返回地址规则、因此展开现在可以正常工作。  
    再次感谢您的支持。