From 19a197c53754cd1e322a3147f17f6745ba3b878a Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 12 Mar 2025 17:38:01 +0100 Subject: [PATCH 1/3] gh-127503: Improve tracebacks on Emscripten when there is a trap This PR solves two problems: 1. No Python traceback shown on segfault/trap 2. The JavaScript source line is shown The JavaScript source line is super long and completely unenlightening, whereas the Python traceback is very helpful. --- Tools/wasm/emscripten/node_entry.mjs | 12 +++++++++++- configure | 2 +- configure.ac | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Tools/wasm/emscripten/node_entry.mjs b/Tools/wasm/emscripten/node_entry.mjs index 98b8f572a7e762..166df40742b7fc 100644 --- a/Tools/wasm/emscripten/node_entry.mjs +++ b/Tools/wasm/emscripten/node_entry.mjs @@ -32,6 +32,8 @@ const thisProgramIndex = process.argv.findIndex((x) => const settings = { preRun(Module) { + // Globally expose API object so we can access it if we raise on startup. + globalThis.Module = Module; mountDirectories(Module); Module.FS.chdir(process.cwd()); Object.assign(Module.ENV, process.env); @@ -45,4 +47,12 @@ const settings = { arguments: process.argv.slice(thisProgramIndex + 1), }; -await EmscriptenModule(settings); +try { + await EmscriptenModule(settings); +} catch(e) { + // Show JavaScript exception and traceback + console.warn(e); + // Show Python exception and traceback + Module.__Py_DumpTraceback(2, Module._PyGILState_GetThisThreadState()); + process.exit(1); +} diff --git a/configure b/configure index 677d0e8840676f..fea9d294e5e75b 100755 --- a/configure +++ b/configure @@ -9631,7 +9631,7 @@ fi as_fn_append LINKFORSHARED " -sFORCE_FILESYSTEM -lidbfs.js -lnodefs.js -lproxyfs.js -lworkerfs.js" as_fn_append LINKFORSHARED " -sEXPORTED_RUNTIME_METHODS=FS,callMain,ENV" - as_fn_append LINKFORSHARED " -sEXPORTED_FUNCTIONS=_main,_Py_Version,__PyRuntime,__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET" + as_fn_append LINKFORSHARED " -sEXPORTED_FUNCTIONS=_main,_Py_Version,__PyRuntime,__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET,_PyGILState_GetThisThreadState,_Py_DumpTraceback" as_fn_append LINKFORSHARED " -sSTACK_SIZE=5MB" if test "x$enable_wasm_dynamic_linking" = xyes diff --git a/configure.ac b/configure.ac index 7ff0251b718386..8bb0f1c6ef4a49 100644 --- a/configure.ac +++ b/configure.ac @@ -2370,7 +2370,7 @@ AS_CASE([$ac_sys_system], dnl Include file system support AS_VAR_APPEND([LINKFORSHARED], [" -sFORCE_FILESYSTEM -lidbfs.js -lnodefs.js -lproxyfs.js -lworkerfs.js"]) AS_VAR_APPEND([LINKFORSHARED], [" -sEXPORTED_RUNTIME_METHODS=FS,callMain,ENV"]) - AS_VAR_APPEND([LINKFORSHARED], [" -sEXPORTED_FUNCTIONS=_main,_Py_Version,__PyRuntime,__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET"]) + AS_VAR_APPEND([LINKFORSHARED], [" -sEXPORTED_FUNCTIONS=_main,_Py_Version,__PyRuntime,__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET,_PyGILState_GetThisThreadState,__Py_DumpTraceback"]) AS_VAR_APPEND([LINKFORSHARED], [" -sSTACK_SIZE=5MB"]) AS_VAR_IF([enable_wasm_dynamic_linking], [yes], [ From 5e2f70e7ed7672aad9a8c947f85ff65f44a85e45 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 12 Mar 2025 18:02:04 +0100 Subject: [PATCH 2/3] Add @support.skip_emscripten_stack_overflow to test_infinite_cycle_in_bases --- Lib/test/test_isinstance.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_isinstance.py b/Lib/test/test_isinstance.py index 4f98cbb3762a98..daad00e86432d0 100644 --- a/Lib/test/test_isinstance.py +++ b/Lib/test/test_isinstance.py @@ -327,6 +327,7 @@ def __getattr__(self, attr): with self.assertRaises(RecursionError): issubclass(Failure(), int) + @support.skip_emscripten_stack_overflow() def test_infinite_cycle_in_bases(self): """Regression test for bpo-30570.""" class X: From 6feebefab38de2421d46c11ccf8db73109a2997b Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 12 Mar 2025 20:45:04 +0100 Subject: [PATCH 3/3] Fix configure --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index fea9d294e5e75b..d0ae103014a301 100755 --- a/configure +++ b/configure @@ -9631,7 +9631,7 @@ fi as_fn_append LINKFORSHARED " -sFORCE_FILESYSTEM -lidbfs.js -lnodefs.js -lproxyfs.js -lworkerfs.js" as_fn_append LINKFORSHARED " -sEXPORTED_RUNTIME_METHODS=FS,callMain,ENV" - as_fn_append LINKFORSHARED " -sEXPORTED_FUNCTIONS=_main,_Py_Version,__PyRuntime,__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET,_PyGILState_GetThisThreadState,_Py_DumpTraceback" + as_fn_append LINKFORSHARED " -sEXPORTED_FUNCTIONS=_main,_Py_Version,__PyRuntime,__PyEM_EMSCRIPTEN_COUNT_ARGS_OFFSET,_PyGILState_GetThisThreadState,__Py_DumpTraceback" as_fn_append LINKFORSHARED " -sSTACK_SIZE=5MB" if test "x$enable_wasm_dynamic_linking" = xyes