El específico de Linux backtrace()
y backtrace_symbols()
le permite generar un seguimiento de llamadas del programa. Sin embargo, solo imprime direcciones de función, no sus nombres para mi programa. ¿Cómo puedo hacer que impriman los nombres de las funciones también? Intenté compilar el programa con -g
y -ggdb
. El caso de prueba a continuación sólo imprime esto:Cómo hacer que backtrace()/backtrace_symbols() imprima los nombres de las funciones?
BACKTRACE ------------ ./a.out() [0x8048616] ./a.out() [0x8048623] /lib/libc.so.6(__libc_start_main+0xf3) [0x4a937413] ./a.out() [0x8048421] ----------------------
me gustaría que los 2 primeros elementos para mostrar también los nombres de funciones, foo
y main
Código:
#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;
}
posible duplicado de [Cómo llegar traza más detallada] (http://stackoverflow.com/questions/5945775/how-to-get-more-detailed-backtrace) – Nemo
http://stackoverflow.com/questions/105659/how-can-one-grab-a-stack-trace-in-c –