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函數有各種奇怪的東西,這可能是生活的方式,但我需要能夠通過一個增量變量來實現這個東西,我想要實現一個堆棧翻轉器。如果它只接受不斷的論證,那實在不可能。
有沒有解決方法或更好的方法?
要實現堆棧翻轉器,您可能需要使用一些平臺特定的庫函數 - 除了方便性(與巨大的開關相比)'__builtin_return_address'可能無法通過外部堆棧幀(認爲通過函數的回調函數調用遵循另一個調用約定 - 經典案例:Win32事件循環)。您可能希望在Linux上查找'backtrace'並在Windows上查找'RtlCaptureStackBacktrace'。 –
是的,我在linux環境下工作,並且backtrace工具不提供我需要的所有東西。 libunwind可以,除了這一塊。我寧願不必使用這兩種方法並將它們的輸出交織/合併,這就是爲什麼我希望這個呼叫能夠工作。 –
究竟是什麼'回溯'失蹤?一些堆棧幀?或者你需要額外的功能?因爲'__builtin_return_address',至少以我在x86上的經驗 - 非常簡單(它只是將保存的ebp解引用直到指定的深度,然後取下一個地址)。 –