Skip to content

Instantly share code, notes, and snippets.

@barathrm
Last active April 12, 2023 10:11
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save barathrm/53dec952edbeddcc9294c97ba1a50677 to your computer and use it in GitHub Desktop.
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
#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