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.

[参考译文] 编译器/RM48L940:有关调试符号的问题

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/837471/compiler-rm48l940-issues-regarding-debug-symbols

器件型号:RM48L940

工具/软件:TI C/C++编译器

我们使用 ARM 编译器 :TI ARM C/C++编译器           v16.9.4.LTS

在使用 gdb 进行调试时、我们发现了两个问题:

定义符号不会添加到调试信息中。 因此、在 GDB 中无法引用定义的常量。

2.从具有浮点参数的 GDB 调用函数时,这些浮点参数被破坏。  

在 GDB 中、您需要使用"设置穿透浮点到双精度0"。  

ARM 编译器可能错误地指示该函数"未进行原型设计"。 请参阅下面的 GDB 源代码注释:

/*向函数传递参数的方式取决于函数是否传递参数
以 K&R 样式或原型样式定义。 如果您定义了
函数、使用获取`float'参数的 K&R 语法
`d方必须将该参数作为"双"传递。 如果您定义了
函数、则必须传递
参数为`float'、无提升。

遗憾的是、在某些较旧的平台上、调试信息不存在
可靠地指出每个函数的定义方式。 函数类型
即使定义了函数、也可以清除 Type_Typelaged 标志
进行了比较。 调用 type_typ原 型的函数时
标志是明确的、GDB 会查询此标志以决定要执行的操作。

对于现代目标、假设原型是正确的
flag 为空、可信任:`float'参数应为
`d为"双"。 对于某些较旧的目标、如果是原型
标志是明确的、这不会告诉我们任何东西。 默认为到
信任调试信息;用户可以覆盖此行为
使用"设置穿透浮点到双精度0"。 */"

通常、type 参数 float 传递给函数的方式取决于函数是否进行原型设计。 对于原型(即 ANSI/ISO 样式)函数, float 根据的体系结构约定,参数不会更改传递。  float对于非原型(即 K&R 样式)函数、 float 参数首先被提升为 type double 、然后传递。

遗憾的是、某些形式的调试信息并不能可靠地指示函数是否进行原型设计。 如果 gdb 调用未标记为原型的函数、则会查询  set c穿透 浮点到双精度

set coerce-float-to-double
set coerce-float-to-double on
类型参数 float  double 在传递到未原型化函数时将提升为。 这是默认设置。
set coerce-float-to-double off
类型的参数 float 将直接传递给未进行原型设计的函数。

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

    dinne Bosman 说:
    定义符号不会添加到调试信息中。

    没错。  预处理器#define 符号在任何调试器中都不可用、包括 GDB 和 CCS (Code Composer Studio)。

    [引用 user="dinne Bosman"]从具有浮点参数的 GDB 调用函数时,这些浮点参数已损坏[/quot]

    我们不会就此行为测试 TI ARM 编译器。  对于 GDB 和 CCS 都是如此。  因此、您需要在 GDB 中找到解决方法来使其正常工作并不奇怪。

    谢谢、此致、

    乔治