2016-12-24 14 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

«Если мы можем получить позицию функции в стеке вызовов»: это либо много команд для выполнения, либо параметр, либо глобальная переменная. –

ответ

2

Он также возвращает общее количество функций в вызове.
Есть ли какие-либо функции, которые возвращают только позицию?

Это один и тот же.

Если стек вызовов:

main -> foo -> bar -> jai 

и вы хотите знать, что jai 4 уровней вложенности, то общее число функций является уровень jai.

Если вы хотите игнорировать main и считаете только «свои» функции, вычтите 1 из общего числа функций.

2

Я бы предложил использовать существующие библиотеки для этого.

Если все (или, по крайней мере, большинство) код скомпилирован с отладочной информацией * в DWARF формате (на Linux), я рекомендую Иэн Тейлор libbacktrace (используется внутри НКУ, но годный к употреблению независимо друг от друга). Когда доступна информация об отладке DWARF, она даже может предоставить информацию о местоположении источника ...

Вы также можете использовать GNU glibc backtrace functions.

См. Также return address builtins GCC.

Примечание *: Вы можете пройти как -g и -O2 к gcc или g++ компилятору иметь как информацию об отладке и оптимизация включена.