Skip to content

Commit c1fa1eb

Browse files
committed
enable stacktrace-on-assert/abort
also stop hiding the top frame from jl_unw_stepn, sometimes it's actually useful
1 parent 32ff279 commit c1fa1eb

File tree

4 files changed

+13
-6
lines changed

4 files changed

+13
-6
lines changed

src/signal-handling.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@ void jl_critical_error(int sig, bt_context_t *context, uintptr_t *bt_data, size_
4848
// This function is not allowed to reference any TLS variables.
4949
// We need to explicitly pass in the TLS buffer pointer when
5050
// we make `jl_filename` and `jl_lineno` thread local.
51-
size_t n = *bt_size;
51+
size_t i, n = *bt_size;
5252
if (sig)
5353
jl_safe_printf("\nsignal (%d): %s\n", sig, strsignal(sig));
5454
jl_safe_printf("while loading %s, in expression starting on line %d\n", jl_filename, jl_lineno);
5555
if (context)
5656
*bt_size = n = rec_backtrace_ctx(bt_data, JL_MAX_BT_SIZE, context);
57-
for(size_t i=0; i < n; i++)
57+
for (i = 0; i < n; i++)
5858
jl_gdblookup(bt_data[i] - 1);
5959
gc_debug_print_status();
6060
gc_debug_critical_error();

src/signals-unix.c

+6-3
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,14 @@ void sigdie_handler(int sig, siginfo_t *info, void *context)
5555
{
5656
sigset_t sset;
5757
uv_tty_reset_mode();
58-
sigfillset(&sset);
59-
sigprocmask(SIG_UNBLOCK, &sset, NULL);
60-
signal(sig, SIG_DFL);
6158
#ifdef __APPLE__
6259
jl_critical_error(sig, (bt_context_t*)&((ucontext64_t*)context)->uc_mcontext64->__ss, jl_bt_data, &jl_bt_size);
6360
#else
6461
jl_critical_error(sig, (bt_context_t*)context, jl_bt_data, &jl_bt_size);
6562
#endif
63+
sigfillset(&sset);
64+
sigprocmask(SIG_UNBLOCK, &sset, NULL);
65+
signal(sig, SIG_DFL);
6666
if (sig != SIGSEGV &&
6767
sig != SIGBUS &&
6868
sig != SIGILL) {
@@ -464,6 +464,9 @@ void jl_install_default_signal_handlers(void)
464464
if (sigaction(SIGILL, &act_die, NULL) < 0) {
465465
jl_errorf("fatal error: sigaction: %s", strerror(errno));
466466
}
467+
if (sigaction(SIGABRT, &act_die, NULL) < 0) {
468+
jl_errorf("fatal error: sigaction: %s", strerror(errno));
469+
}
467470
if (sigaction(SIGSYS, &act_die, NULL) < 0) {
468471
jl_errorf("fatal error: sigaction: %s", strerror(errno));
469472
}

src/signals-win.c

+3
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,9 @@ void jl_install_default_signal_handlers(void)
361361
if (signal(SIGTERM, (void (__cdecl *)(int))crt_sig_handler) == SIG_ERR) {
362362
jl_error("fatal error: Couldn't set SIGTERM");
363363
}
364+
if (signal(SIGABRT, (void (__cdecl *)(int))crt_sig_handler) == SIG_ERR) {
365+
jl_error("fatal error: Couldn't set SIGABRT");
366+
}
364367
SetUnhandledExceptionFilter(exception_handler);
365368
}
366369

src/stackwalk.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,14 @@ size_t jl_unw_stepn(bt_cursor_t *cursor, uintptr_t *ip, uintptr_t *sp, size_t ma
4040
#endif
4141
while (1) {
4242
if (n >= maxsize) {
43-
n += 1; // return maxsize + 1 if ran out of space
43+
n = maxsize; // return maxsize + 1 if ran out of space
4444
break;
4545
}
4646
if (!jl_unw_step(cursor, &ip[n], sp ? &sp[n] : &nullsp))
4747
break;
4848
n++;
4949
}
50+
n++;
5051
#if !defined(_OS_WINDOWS_)
5152
}
5253
else {

0 commit comments

Comments
 (0)