2016-11-14 129 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它確實生成相當一些醜陋的代碼 –