Source code

Revision control

Copy as Markdown

Other Tools

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
"""
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 WasmFaultHandler is installed as the SIGSEGV signal action.
sigaction_fn = gdb.parse_and_eval(
"(void(*)(int,void*,void*))__sigaction"
).dereference()
sigaction_fn(SIGSEGV, 0, buf)
WasmTrapHandler = gdb.parse_and_eval("WasmTrapHandler")
if buf["__sigaction_handler"]["sa_handler"] == WasmTrapHandler:
# Advise the user that magic is happening.
print("js/src/gdb/mozilla/asmjs.py: Allowing WasmTrapHandler to run.")
# If WasmTrapHandler 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)