Das Linux-spezifische backtrace()
und backtrace_symbols()
ermöglicht es Ihnen, eine Aufrufverfolgung des Programms zu erstellen. Es werden jedoch nur Funktionsadressen gedruckt, nicht deren Namen für mein Programm. Wie kann ich sie dazu bringen, auch die Funktionsnamen zu drucken? Ich habe versucht , mit dem Programm zusammenzustellen -g
sowie -ggdb
. Der folgende Testfall druckt nur Folgendes:
HINTERGRUND ------------ ./a.out () [0x8048616] ./a.out () [0x8048623] /lib/libc.so.6(__libc_start_main+0xf3) [0x4a937413] ./a.out () [0x8048421] ----------------------
Ich würde die ersten 2 Artikel wollen auch die Funktionsnamen zeigen, foo
undmain
Code:
#include <execinfo.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
static void full_write(int fd, const char *buf, size_t len)
{
while (len > 0) {
ssize_t ret = write(fd, buf, len);
if ((ret == -1) && (errno != EINTR))
break;
buf += (size_t) ret;
len -= (size_t) ret;
}
}
void print_backtrace(void)
{
static const char start[] = "BACKTRACE ------------\n";
static const char end[] = "----------------------\n";
void *bt[1024];
int bt_size;
char **bt_syms;
int i;
bt_size = backtrace(bt, 1024);
bt_syms = backtrace_symbols(bt, bt_size);
full_write(STDERR_FILENO, start, strlen(start));
for (i = 1; i < bt_size; i++) {
size_t len = strlen(bt_syms[i]);
full_write(STDERR_FILENO, bt_syms[i], len);
full_write(STDERR_FILENO, "\n", 1);
}
full_write(STDERR_FILENO, end, strlen(end));
free(bt_syms);
}
void foo()
{
print_backtrace();
}
int main()
{
foo();
return 0;
}
backtrace_symbols_fd
führt die Funktion dieselbe Operation aus wie backtrace_symbols()
, aber die resultierenden Zeichenfolgen werden sofort in den Dateideskriptor geschrieben fd
.