Инструмент для отслеживания локальных вызовов функций в Linux - PullRequest
59 голосов
/ 23 ноября 2008

Я ищу инструмент типа ltrace или strace , который может отслеживать локально определенные функции в исполняемом файле. ltrace отслеживает только динамические библиотечные вызовы, а strace only отслеживает системные вызовы. Например, для следующей программы на C:

#include <stdio.h>

int triple ( int x )
{
  return 3 * x;
}

int main (void)
{
  printf("%d\n", triple(10));
  return 0;
}

Запуск программы с ltrace покажет вызов printf, поскольку это стандартная библиотечная функция (которая является динамической библиотекой в ​​моей системе), а strace покажет все системные вызовы из кода запуска, системные вызовы, используемые для реализации printf, и код завершения работы, но я хочу кое-что, что покажет мне, что была вызвана функция triple. Предполагая, что локальные функции не были встроены оптимизирующим компилятором и что двоичный файл не был удален (символы удалены), есть ли инструмент, который может это сделать?

Редактировать

Пара уточнений:

  • Это нормально, если инструмент также предоставляет информацию трассировки для нелокальных функций.
  • Я не хочу перекомпилировать программу (ы) с поддержкой определенных инструментов, информации о символах в исполняемом файле должно быть достаточно.
  • Было бы здорово, если бы я мог использовать этот инструмент для присоединения к существующим процессам, как я могу с помощью ltrace / strace.

Ответы [ 13 ]

1 голос
/ 23 ноября 2008

Gprof может быть тем, что вы хотите

0 голосов
/ 14 марта 2014

ПРИМЕЧАНИЕ. Это не ftrace на основе ядра Linux, а инструмент, который я недавно разработал для выполнения локальной трассировки функций и управления потоком. Linux ELF x86_64 / x86_32 поддерживаются публично.

https://github.com/leviathansecurity/ftrace

0 голосов
/ 23 ноября 2008

Надеемся, что инструменты callgrind или cachegrind для Valgrind предоставят вам необходимую информацию.

...