summaryrefslogtreecommitdiffstats
path: root/js/src/gdb/mozilla/asmjs.py
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/gdb/mozilla/asmjs.py')
-rw-r--r--js/src/gdb/mozilla/asmjs.py40
1 files changed, 40 insertions, 0 deletions
diff --git a/js/src/gdb/mozilla/asmjs.py b/js/src/gdb/mozilla/asmjs.py
new file mode 100644
index 000000000..43fac20c7
--- /dev/null
+++ b/js/src/gdb/mozilla/asmjs.py
@@ -0,0 +1,40 @@
+"""
+In asm code, out-of-bounds heap accesses cause segfaults, which the engine
+handles internally. Make GDB ignore them.
+"""
+
+import gdb
+
+SIGSEGV = 11
+
+# A sigaction buffer for each inferior process.
+sigaction_buffers = {}
+
+def on_stop(event):
+ if isinstance(event, gdb.SignalEvent) and event.stop_signal == 'SIGSEGV':
+ # Allocate memory for sigaction, once per js shell process.
+ process = gdb.selected_inferior()
+ buf = sigaction_buffers.get(process)
+ if buf is None:
+ buf = gdb.parse_and_eval("(struct sigaction *) malloc(sizeof(struct sigaction))")
+ sigaction_buffers[process] = buf
+
+ # See if AsmJSFaultHandler is installed as the SIGSEGV signal action.
+ sigaction_fn = gdb.parse_and_eval('__sigaction')
+ sigaction_fn(SIGSEGV, 0, buf)
+ AsmJSFaultHandler = gdb.parse_and_eval("AsmJSFaultHandler")
+ if buf['__sigaction_handler']['sa_handler'] == AsmJSFaultHandler:
+ # Advise the user that magic is happening.
+ print("js/src/gdb/mozilla/asmjs.py: Allowing AsmJSFaultHandler to run.")
+
+ # If AsmJSFaultHandler doesn't handle this segfault, it will unhook
+ # itself and re-raise.
+ gdb.execute("continue")
+
+def on_exited(event):
+ if event.inferior in sigaction_buffers:
+ del sigaction_buffers[event.inferior]
+
+def install():
+ gdb.events.stop.connect(on_stop)
+ gdb.events.exited.connect(on_exited)