2016-11-14 53 views
1

这很令人困惑。使用G ++ 4.9.1:__builtin_return_address不会将变量作为参数

int main() 
{ 
    void* r1 = __builtin_return_address(0); // fine 
    unsigned int foo = 0; 
    void* r2 = __builtin_return_address(foo); // does not compile 
} 

返回的错误是error: invalid argument to ‘__builtin_return_address’

的文件说,该函数只有一个unsigned int。我知道__builtin函数有各种奇怪的东西,这可能是生活的方式,但我需要能够通过一个增量变量来实现这个东西,我想要实现一个堆栈翻转器。如果它只接受不断的论证,那实在不可能。

有没有解决方法或更好的方法?

+0

要实现堆栈翻转器,您可能需要使用一些平台特定的库函数 - 除了方便性(与巨大的开关相比)'__builtin_return_address'可能无法通过外部堆栈帧(认为通过函数的回调函数调用遵循另一个调用约定 - 经典案例:Win32事件循环)。您可能希望在Linux上查找'backtrace'并在Windows上查找'RtlCaptureStackBacktrace'。 –

+0

是的,我在linux环境下工作,并且backtrace工具不提供我需要的所有东西。 libunwind可以,除了这一块。我宁愿不必使用这两种方法并将它们的输出交织/合并,这就是为什么我希望这个呼叫能够工作。 –

+0

究竟是什么'回溯'失踪?一些堆栈帧?或者你需要额外的功能?因为'__builtin_return_address',至少以我在x86上的经验 - 非常简单(它只是将保存的ebp解引用直到指定的深度,然后取下一个地址)。 –

回答

0

只需制作您自己的巨大开关/外壳或者如果/其他树达到您需要的水平。你可以使用宏来简化它。

+0

https://godbolt.org/g/Dl3Yfb jeez它确实生成相当一些丑陋的代码 –