#include #include #include #include #include #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; }