-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Crash in recursive function with many intermediate allocations #55192
Comments
Should the GC segfault not get its own issue? |
I suspect you are very close to the stack edge when you called the GC and just calling a few sweep functions made you overflow. Instrumentation: diff --git a/src/signals-mach.c b/src/signals-mach.c
index ad5788ea23..5cce9fe715 100644
--- a/src/signals-mach.c
+++ b/src/signals-mach.c
@@ -296,6 +296,13 @@ static void segv_handler(int sig, siginfo_t *info, void *context)
jl_call_in_state(ptls, (host_thread_state_t*)jl_to_bt_context(context), &jl_sig_throw);
}
else {
+ ucontext_t *ucontext = (ucontext_t*)context;
+ // read the fault address
+ uintptr_t addr = (uintptr_t)info->si_addr;
+ // read the stack pointer
+ uintptr_t rsp = ucontext->uc_mcontext->__ss.__sp;
+ jl_safe_printf("Fatal error: %s (%d)\n", sig == SIGSEGV ? "Segmentation fault" : "Bus error", sig);
+ jl_safe_printf("Faulting address: %p, stack pointer: %p\n", (void*)addr, (void*)rsp);
sigdie_handler(sig, info, context);
}
} Results:
Judging by how suspiciously close the faulting address extracted from Though I think that the error message here could be better. |
Duplicate of #53033 |
For what is worth, I wasn't asking to add tail-call optimisation, @vchuravy suggested on slack to open the issue because this code shouldn't blow up the stack (and this wasn't until v1.10) |
While reading https://www.modular.com/blog/mojo-vs-rust-is-mojo-faster-than-rust, I wanted to see how Julia fares with the TCO example. I tried this translation:
The stackoverflow error is new in Julia v1.11, it works up to Julia v1.10:
For the record, LLVM IR of the julia version:
Julia LLVM IR
For comparison, the LLVM IR of the Rust version, which doesn't blow up the stack, from the Mojo blogpost:
Rust LLVM IR
Side note, it'd be amazing if the compiler would detect that all the allocations and stores are unused and it'd just elide them 🙂
Tangentially related, at the beginning I wrote a slightly different implementation of the recursive function which has much better performance, but on Julia nightly (same version as bove) it runs in a segfault in the garbage collector for larger arrays:
The text was updated successfully, but these errors were encountered: