Linux cụ thể backtrace()
và backtrace_symbols()
cho phép bạn tạo ra một dấu vết cuộc gọi của chương trình. Tuy nhiên, nó chỉ in địa chỉ hàm chứ không in tên của chúng cho chương trình của tôi. Làm cách nào để tôi có thể in cả tên hàm? Tôi đã cố gắng biên soạn chương trình với -g
cũng như -ggdb
. Trường hợp thử nghiệm bên dưới chỉ in ra:
BACKTRACE ------------ ./a.out () [0x8048616] ./a.out () [0x8048623] /lib/libc.so.6(__libc_start_main+0xf3) [0x4a937413] ./a.out () [0x8048421] ----------------------
Tôi muốn 2 mục đầu tiên cũng hiển thị tên hàm foo
vàmain
Mã:
#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;
}