__builtin_return_address为索引> 0返回null?

时间:2014-11-12 13:22:31

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

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

请帮我这个或者告诉我任何其他功能来获得相同的。

2 个答案:

答案 0 :(得分:3)

请参阅this answer相关问题。

__builtin_return_address具有GCC和处理器特定功能(在部分处理器上的某些版本的Clang中也可用一些 -lack of-optimization),并记录为

  

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

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

所以你可能得到NULL,因为这些信息不可用!

答案 1 :(得分:0)

除了编译器优化原因(IMO是您面临的问题的最可能原因)之外,GCC documentation状态非常清楚:

  

使用非零参数调用此函数可能会产生不可预测的影响,包括使调用程序崩溃。因此,-Wframe-address选项生效时,将诊断出被视为不安全的呼叫。这种调用只能在调试情况下进行。

正如Basile所说,因为它是一个内置的编译器(读取:特定于处理器并且使用的主意很糟糕),行为异常松散定义(因为它不是任何标准所要求的,也不是必须作出任何保证。)

只需使用backtrace(3),它符合POSIX标准,不依赖编译器内置。