2016-12-24 81 views
0

爲了給出一個背景,我想以一種整潔的方式直觀地打印基於調用堆棧的日誌消息。如何獲取函數在調用堆棧中的位置?

例如。

應該給輸出

foo(){ 
    printf("Foo was called"); 
    bar(); 
} 

bar(){ 
    printf("bar was called"); 
    jai(); 
} 
jai(){ 
    printf("Jai was called"); 
} 

<<<OUTPUT>>> 
Foo was called. 
    bar was called 
     jai was called. 

我並不想傳遞的空格數作爲參數,這些功能或保持相同的全局計數。

我在想,如果我們可以在調用堆棧中獲得函數的位置,那麼我們可以在文本之前填充相同數量的空格以獲得所需的輸出格式。

我看到backtrace函數調用提供了整個堆棧名稱以及返回。它還返回調用中的函數總數。

是否有任何函數只返回位置?

+0

「_if我們可以在調用堆棧_中獲得函數的位置」:這是要執行的很多指令,或者是一個參數,或者一個全局變量。 –

回答

2

它還返回呼叫中的函數總數。
是否有任何函數只返回位置?

它們是一個也是一樣的。

如果調用堆棧:

main -> foo -> bar -> jai 

,你想知道jai是4級深,功能然後總數爲jai水平。

如果您想忽略main並只計算「您的」功能,則從功能總數中減去1。

2

我會建議使用現有的庫。

如果您的所有代碼(或至少大多數)與調試信息*侏儒格式(在Linux上)編譯的,我建議伊恩·泰勒的libbacktrace(內部使用GCC,但可用的獨立)。當DWARF調試信息可用時,甚至可以提供源位置信息...

您也可以使用GNU glibc backtrace functions

另請參閱GCC的return address builtins

注*:您可以通過兩種-g-O2gccg++編譯器同時具有調試信息和優化功能。

相關問題