import gdb
SIGSEGV = 11
sigaction_buffers = {}
def on_stop(event):
if isinstance(event, gdb.SignalEvent) and event.stop_signal == 'SIGSEGV':
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
sigaction_fn = gdb.parse_and_eval('__sigaction')
sigaction_fn(SIGSEGV, 0, buf)
WasmFaultHandler = gdb.parse_and_eval("WasmFaultHandler")
if buf['__sigaction_handler']['sa_handler'] == WasmFaultHandler:
print("js/src/gdb/mozilla/asmjs.py: Allowing WasmFaultHandler to run.")
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)