Print function name and file location when caught a SIGSEGV
This commit is contained in:
51
debugus.c
51
debugus.c
@@ -145,6 +145,14 @@ void brk_disable(Brk *brk)
|
||||
brk->enabled = false;
|
||||
}
|
||||
|
||||
void symbols_deinit(Symbols *s)
|
||||
{
|
||||
for (int i = 0; i < s->count; i++) {
|
||||
free((char *)s->items[i].name);
|
||||
}
|
||||
da_deinit(s);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
const char *file;
|
||||
pid_t pid;
|
||||
@@ -152,6 +160,8 @@ typedef struct {
|
||||
HashTable brks;
|
||||
uintptr_t program_load_offset;
|
||||
HashTable js_descs;
|
||||
Symbols symbols;
|
||||
FILE *binfile;
|
||||
PLibelfinBinding plibelfin;
|
||||
} Dbg;
|
||||
|
||||
@@ -165,7 +175,26 @@ siginfo_t dbg_get_siginfo(Dbg *dbg)
|
||||
void dbg_handle_sigsegv(Dbg *dbg, siginfo_t info)
|
||||
{
|
||||
unused(dbg);
|
||||
uint64_t dbg_get_rip(Dbg *dbg);
|
||||
LOG_ERR("Caught a segfault %d. SKILL ISSUE BRO\n", info.si_code);
|
||||
uintptr_t rip = (uintptr_t)dbg_get_rip(dbg);
|
||||
uintptr_t nearest = rip - dbg->symbols.items[0].addr;
|
||||
for (int i = 0; i < dbg->symbols.count; i++) {
|
||||
if (rip - dbg->symbols.items[i].addr < nearest) {
|
||||
nearest = rip - dbg->symbols.items[i].addr;
|
||||
}
|
||||
}
|
||||
uintptr_t addr = rip - nearest;
|
||||
for (int i = 0; i < dbg->symbols.count; i++) {
|
||||
if (dbg->symbols.items[i].addr == addr) {
|
||||
AddrInfo *ai = libelfin_wrap_info_from_rip(dbg->plibelfin, (uint64_t)(addr - dbg->program_load_offset));
|
||||
if (ai != NULL) {
|
||||
LOG_INF("%s:%zu in function %s()\n", ai->file, (size_t)ai->line, dbg->symbols.items[i].name);
|
||||
libelfin_wrap_free_info(ai);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dbg_handle_sigtrap(Dbg *dbg, siginfo_t info)
|
||||
@@ -538,17 +567,29 @@ void dbg_load_script(Dbg *dbg, const char *script_path)
|
||||
fclose(script);
|
||||
}
|
||||
|
||||
void dbg_libelfin_wrap_init(Dbg *dbg)
|
||||
void dbg_init_bin(Dbg *dbg)
|
||||
{
|
||||
FILE *bin = fopen(dbg->file, "rb");
|
||||
if (bin == NULL) {
|
||||
LOG_ERR("could not open file %s: %s\n", dbg->file, strerror(errno));
|
||||
return;
|
||||
}
|
||||
dbg->binfile = bin;
|
||||
}
|
||||
|
||||
dbg->plibelfin = libelfin_wrap_get_binding(fileno(bin));
|
||||
void dbg_libelfin_wrap_init(Dbg *dbg)
|
||||
{
|
||||
dbg->plibelfin = libelfin_wrap_get_binding(fileno(dbg->binfile), dbg->program_load_offset);
|
||||
}
|
||||
|
||||
fclose(bin);
|
||||
void dbg_load_symbols(Dbg *dbg)
|
||||
{
|
||||
libelfin_wrap_get_syms(dbg->plibelfin, &dbg->symbols);
|
||||
|
||||
for (int i = 0; i < dbg->symbols.count; i++) {
|
||||
Symbol *s = &dbg->symbols.items[i];
|
||||
LOG_INF("Found symbol %s 0x%"PRIxPTR"\n", s->name, s->addr);
|
||||
}
|
||||
}
|
||||
|
||||
void dbg_init(Dbg *dbg, const char *file, pid_t pid)
|
||||
@@ -559,7 +600,9 @@ void dbg_init(Dbg *dbg, const char *file, pid_t pid)
|
||||
hashtable_init(&dbg->js_descs, MAX_JS_FUNCS);
|
||||
dbg_init_js(dbg);
|
||||
dbg_init_load_offset(dbg);
|
||||
dbg_init_bin(dbg);
|
||||
dbg_libelfin_wrap_init(dbg);
|
||||
dbg_load_symbols(dbg);
|
||||
hashtable_init(&dbg->brks, MAX_BRKS);
|
||||
dbg_load_script(dbg, INIT_SCRIPT);
|
||||
}
|
||||
@@ -569,7 +612,9 @@ void dbg_deinit(Dbg *dbg)
|
||||
js_freestate(dbg->js);
|
||||
hashtable_deinit(&dbg->brks);
|
||||
hashtable_deinit(&dbg->js_descs);
|
||||
symbols_deinit(&dbg->symbols);
|
||||
libelfin_wrap_free_binding(dbg->plibelfin);
|
||||
fclose(dbg->binfile);
|
||||
}
|
||||
|
||||
void dbg_loop(Dbg *dbg)
|
||||
|
||||
Reference in New Issue
Block a user