LINUX.ORG.RU

Вывод в консоль всех вызываемых функций по ходу выполнения программы. Есть ли такая тулза?

 , , , ,


1

3

Чтобы подцепить её к бинарнику и чтоб она по ходу выполнения программы печатала каждую вызываемую функцию, значения аргументов и возвращаемый результат. Наподобие того, что выдаёт strace, но не для системных вызовов, а для функций внутри программы. Или может быть gdb умеет такое? Желаемое конечно можно реализовать и вручную, напихав в исходниках printf-ов, но хотелось бы чего-нибудь более автоматизированного. При наличии отладочных символов это технически вполне реализуемо

★★★★★

instrument functions?

-finstrument-functions

    Generate instrumentation calls for entry and exit to functions. Just after function entry and just before function exit, the following profiling functions are called with the address of the current function and its call site.

Правда это тоже немного вручную. Но лучше чем «напихать в исходники printf-ов»

vmx ★★ ()
Последнее исправление: vmx (всего исправлений: 1)
Ответ на: комментарий от vmx

Правда это тоже немного вручную.

Есть uftrace, который использует -finstrument-functions и выполняет форматирование.

xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

Есть uftrace

Интересно, почему они так сложно сделали? Я даже не выдержал и набросал свой вариант

https://gist.github.com/vmxdev/27550410c624e5bdb88ade96cf3ff5cb

Он тупо скармливает адреса функций addr2line и печатает трейс с форматированием. Такой код:

static void
world()
{
	printf("Hello world!\n");
}

static void
hello()
{
	world();
}

int
main()
{
	hello();
	return 0;
}

генерирует что-то вроде

TRACE:function main at /home/vm/instr_trace/instr_trace.c:82 {
TRACE: function hello at /home/vm/instr_trace/instr_trace.c:76 {
TRACE:  function world at /home/vm/instr_trace/instr_trace.c:70 {
Hello world!
TRACE:  }
TRACE: }
TRACE:}

То есть именно так как я сделал будет адово тормозить, конечно, но если кешировать пары 'адрес'-'информация о функции', должно быть вполне бодренько.

vmx ★★ ()

Глянул в репозитории дебиана:

для библиотек есть вот такое

latrace - traces library calls in dynamically linked programs

для внутренних функций

uftrace - Traces and analyzes execution of programs written in C/C++

anonymous ()
Ответ на: комментарий от vmx

Интересно, почему они так сложно сделали?

Там около 1K строк кода, из которых половина парсит DWARF для вывода аргументов, а ещё четверть выполняет форматирование строк для них же. Плюс фильтрация по именам функций и поддержка потоков.

xaizek ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.