52 lines
1008 B
C
52 lines
1008 B
C
#include <execinfo.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <ucore/ucore_backtrace.h>
|
|
|
|
#define MAX_BACKTRACE_SYMBOLS 96
|
|
|
|
void uc_backtrace_fd(int fd)
|
|
{
|
|
void *buffer[MAX_BACKTRACE_SYMBOLS];
|
|
void **syms;
|
|
int ptrs;
|
|
|
|
ptrs = backtrace(buffer, MAX_BACKTRACE_SYMBOLS);
|
|
if (ptrs > 0) { //dont print out this function
|
|
ptrs--;
|
|
syms = &buffer[1];
|
|
} else {
|
|
syms = &buffer[0];
|
|
}
|
|
|
|
backtrace_symbols_fd(syms, ptrs, fd);
|
|
}
|
|
|
|
void uc_backtrace_buf(char *buf, size_t len)
|
|
{
|
|
void *buffer[MAX_BACKTRACE_SYMBOLS];
|
|
int ptrs;
|
|
char **lines;
|
|
size_t remaining = len;
|
|
int i;
|
|
|
|
ptrs = backtrace(buffer, MAX_BACKTRACE_SYMBOLS);
|
|
|
|
buf[0] = 0;
|
|
|
|
lines = backtrace_symbols(buffer, ptrs);
|
|
for (i = 1; i < ptrs; i++) {
|
|
|
|
int rc = snprintf(buf, remaining, "%s\n", lines[i]);
|
|
|
|
if (rc <= 0 || (size_t)rc >= remaining) {
|
|
break;
|
|
}
|
|
|
|
remaining -= rc;
|
|
buf += rc;
|
|
}
|
|
|
|
free(lines);
|
|
}
|