Когда вы компилируете для профилирования, используя -pg
, компилятор автоматически вставляет вызов функции с именем mcount
.Эта функция предоставляется специальной библиотекой и создает базу данных всех вызовов (с адресом from-to-address и счетчиком).
Однако, если вы предоставляете свою собственную функцию mcount (будьте осторожны не для компиляции с включенным профилированием!) Он может делать все что угодно.
Я не проверял это, и я не знаю, каковы параметры mcount (хотя я 'Я уверен, что это не так уж сложно выяснить), но пример реализации может выглядеть следующим образом:
void mcount (void *to)
{
void *from = __builtin_return_address ();
printf ("call from %p to %p\n", from, to);
}
Затем можно использовать addr2line
, чтобы выяснить, какая функция содержит какой адрес.
Однако есть проблема: он считает только те функции, которые были скомпилированы с включенным профилированием, и этот , вероятно, не включает функции библиотеки C, такие как printf.
Однако, если вашВ системе есть библиотека C с профилем, тогда вам нужно быть очень осторожными при вызове функций , которые затем могут вызвать mcount
, иначе вы получите бесконечный цикл.Одним из решений будет вывод текста вручную с использованием системных вызовов, возможно, записанных в asm.Другим решением будет обнаружение рекурсивных вызовов и возврат без каких-либо действий, но это будет проблематично в многопоточном приложении или даже с обработчиками сигналов.