This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
2023-11-22 21:14:15 -05:00

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