Improve backtraces

We're now able to rewind the instruction pointer in x86 backtraces. This
helps ensure addr2line cannot print information about unrelated adjacent
code. I've restored -fno-schedule-insns2 in most cases because it really
does cause unpredictable breakage for backtraces.
This commit is contained in:
Justine Tunney 2024-05-30 15:11:45 -07:00
parent cd672e251f
commit 9b6718ac99
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
11 changed files with 118 additions and 24 deletions

View file

@ -24,6 +24,8 @@
#include "libc/dce.h"
#include "libc/errno.h"
#include "libc/fmt/itoa.h"
#include "libc/intrin/describebacktrace.internal.h"
#include "libc/intrin/iscall.internal.h"
#include "libc/intrin/kprintf.h"
#include "libc/intrin/promises.internal.h"
#include "libc/intrin/weaken.h"
@ -112,6 +114,8 @@ static int PrintBacktraceUsingAddr2line(int fd, const struct StackFrame *bp) {
--gi;
} while ((addr = garbage->p[gi].ret) == (uintptr_t)_weaken(__gc));
}
if (!kisdangerous((const unsigned char *)addr))
addr -= __is_call((const unsigned char *)addr);
#endif
argv[i++] = buf + j;
buf[j++] = '0';

View file

@ -20,6 +20,7 @@
#include "libc/calls/calls.h"
#include "libc/cosmo.h"
#include "libc/fmt/itoa.h"
#include "libc/intrin/iscall.internal.h"
#include "libc/intrin/kprintf.h"
#include "libc/intrin/weaken.h"
#include "libc/log/backtrace.internal.h"
@ -76,6 +77,8 @@ dontinstrument dontasan int PrintBacktraceUsingSymbols(
--gi;
} while ((addr = garbage->p[gi].ret) == (intptr_t)_weaken(__gc));
}
if (!kisdangerous((const unsigned char *)addr))
addr -= __is_call((const unsigned char *)addr);
#endif
if (addr) {
if ((symbol = __get_symbol(st, addr)) != -1) {