Чтобы исполняемый файл печатал имена функций по мере их вызова, в системе GNU вы можете использовать опцию gcc
's -finstrument-functions
и dladdr()
для преобразования адресов в имена функций.
Создать instrument.c
лайк:
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
#define TRACE_FD 3
void __cyg_profile_func_enter (void *, void *)
__attribute__((no_instrument_function));
void __cyg_profile_func_enter (void *func, void *caller)
{
static FILE* trace = NULL;
Dl_info info;
if (trace == NULL) {
trace = fdopen(TRACE_FD, "w");
if (trace == NULL) abort();
setbuf(trace, NULL);
}
if (dladdr(func, &info))
fprintf (trace, "%p [%s] %s\n",
func,
info.dli_fname ? info.dli_fname : "?",
info.dli_sname ? info.dli_sname : "?");
}
А затем скомпилируйте исполняемый файл как:
$ gcc -O0 -rdynamic -finstrument-functions square.c instrument.c -ldl
$./a.out 3>&1
0x400a8f [./a.out] main
0x400a4f [./a.out] square
(здесь используется fd 3 для вывода имен функций, чтобы отделить их от потоков stdout и stderr ).
Вы можете адаптировать код для печати только dli_sname
, если вам нужно только имя функции.
Форматом вывода diff можно управлять, поэтому в вашем случае необходимо 3 варианта:
diff --old-group-format='' --new-group-format='' \
--unchanged-group-format='%=' a.txt b.txt
man diff
бесполезно читать лучшеinfo diff
или используйтеcomm