Last active
April 12, 2023 10:11
-
-
Save barathrm/53dec952edbeddcc9294c97ba1a50677 to your computer and use it in GitHub Desktop.
example usage of libbacktrace with hacked-in support for dlpi_name and dlpi_addr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <backtrace.h> | |
struct backtrace_state* bt_state = NULL; | |
void bt_error_callback(void* data, const char* msg, int errno) | |
{ | |
fprintf(stderr, "bt_error %d: %s\n", errno, msg); | |
} | |
struct syminfo | |
{ | |
uintptr_t sym_addr; | |
uintptr_t base_address; | |
const char* binary_filename; | |
}; | |
void backtrace_syminfo_cb(void* data, | |
uintptr_t pc, | |
const char* symname, | |
uintptr_t symval, | |
uintptr_t symsize, | |
const char* binary_filename, | |
uintptr_t base_address) | |
{ | |
struct syminfo* bla = (struct syminfo*)data; | |
bla->sym_addr = symval; | |
bla->base_address = base_address; | |
bla->binary_filename = ((binary_filename == NULL || binary_filename[0] == '\0') ? "executable?" : binary_filename); | |
} | |
int bt_full_callback(void* data, uintptr_t pc, const char* filename, int lineno, const char* function) | |
{ | |
int* cnt = (int*)data; | |
struct syminfo symdata; | |
backtrace_syminfo(bt_state, pc, &backtrace_syminfo_cb, &bt_error_callback, (void*)&symdata); | |
const char* source_filename = ((filename == NULL || filename[0] == '\0') ? "unknown" : filename); | |
printf("%4d # %s in %s:%d from %s(+0x%lx)[0x%lx]\n", | |
(*cnt)++, | |
(function == NULL ? "unknown" : function), | |
source_filename, | |
lineno, | |
symdata.binary_filename, | |
symdata.sym_addr - symdata.base_address, | |
symdata.base_address); | |
return 0; | |
} | |
void stacktrace() | |
{ | |
bt_state = backtrace_create_state(NULL, /* THREADED */ 0, &bt_error_callback, NULL); | |
if(bt_state == NULL) | |
{ | |
fprintf(stderr, "failed to create bt state\n"); | |
return; | |
} | |
int cnt = 0; | |
int bt_full_ret = backtrace_full(bt_state, 0, &bt_full_callback, &bt_error_callback, (void*)&cnt); | |
} | |
int main() | |
{ | |
stacktrace(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment