52 lines
1.1 KiB
C
52 lines
1.1 KiB
C
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <execinfo.h>
|
|
#include <elfutils/libdwfl.h>
|
|
|
|
#define MAX_STACK_FRAMES 64
|
|
static void *stack_traces[MAX_STACK_FRAMES];
|
|
|
|
void print_trace() {
|
|
int stack_depth = backtrace(stack_traces, MAX_STACK_FRAMES);
|
|
Dwfl_Callbacks callbacks = {
|
|
.find_elf = dwfl_linux_proc_find_elf,
|
|
.find_debuginfo = dwfl_standard_find_debuginfo,
|
|
.debuginfo_path = NULL
|
|
};
|
|
|
|
Dwfl *dwfl = dwfl_begin(&callbacks);
|
|
dwfl_linux_proc_report(dwfl, getpid());
|
|
dwfl_report_end(dwfl, NULL, NULL);
|
|
|
|
for (int i = 0; i < stack_depth; ++i) {
|
|
const char *modname;
|
|
const char *symname;
|
|
GElf_Off offset;
|
|
Dwfl_Module *mod = dwfl_addrmodule(dwfl, (uintptr_t)stack_traces[i]);
|
|
Dwfl_Line *line = dwfl_module_getsrc(mod, (uintptr_t)stack_traces[i]);
|
|
const char *src;
|
|
int lineno, colno;
|
|
|
|
if (line) {
|
|
src = dwfl_lineinfo(mod, line, &lineno, &colno, &modname, &symname);
|
|
printf("%s (%d) %s\n", src, lineno, symname);
|
|
}
|
|
}
|
|
|
|
dwfl_end(dwfl);
|
|
}
|
|
|
|
void foo() {
|
|
print_trace();
|
|
}
|
|
|
|
void bar() {
|
|
foo();
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
bar();
|
|
return 0;
|
|
} |