【问题标题】:__builtin_return_address returns null for index >0?__builtin_return_address 为索引 >0 返回 null?
【发布时间】:2014-11-12 13:22:30
【问题描述】:

我想获取调用者函数的返回地址。我正在使用__builtin_return_address() 函数,但如果我给出的索引值大于 0,它将返回NULL

请帮助我或告诉我任何其他功能以获得相同的功能。

【问题讨论】:

  • 为什么你使用它?你的目标是什么?
  • "此函数只能与非零参数一起用于调试目的。"如果您需要堆栈跟踪,还有其他可用的功能。
  • @Deduplicator 我需要存储调用函数的返回地址。
  • 请解释您提出问题的动机。为什么需要调用者函数的返回地址?你会用它做什么?请显示更多代码,因此请编辑您的问题。

标签: c linux linux-kernel linux-device-driver


【解决方案1】:

有关相关问题,请参阅this answer

__builtin_return_addressGCC 和处理器特定的(也可以在 some 带有 some 的处理器上的 some 版本的 Clang 上使用 -缺乏优化),并记录为

在某些机器上,可能无法确定除当前函数之外的任何函数的返回地址

编译器可能会在没有相关信息的情况下优化一个函数(例如,当它使用-fomit-frame-pointertail-calls 或函数inlining 编译时)。

所以您可能收到NULL,因为信息不可用!

【讨论】:

  • 谢谢!!你能告诉我任何其他函数,它给出了函数的返回地址,它不是特定于处理器或在 ARMv7 上工作的。
  • 可能信息不可用。所以没有办法得到不存在的东西。
【解决方案2】:

除了编译器优化原因(IMO 是您所面临问题的最可能原因)之外,GCC documentation 非常明确地指出:

使用非零参数调用此函数可能会产生不可预知的影响,包括使调用程序崩溃。因此,当-Wframe-address 选项生效时,会诊断出被认为不安全的调用。此类调用仅应在调试情况下进行。

正如 Basile 所说,由于它是一个内置编译器(阅读:非常特定于处理器并且使用起来不是一个好主意),因此行为是异常松散定义的(因为任何标准都不需要它并且不必须做出任何保证)。

只需使用backtrace(3),它符合 POSIX,并且不依赖于编译器内置函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 2022-01-14
    • 2017-11-14
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多