Experimental support for auto-reloading when switching threads

This is particularly important when switching threads in a coredump, when you can't just single-step to ensure everything gets reloaded.
pull/24/head
Zach Riggle 10 years ago
parent b456000c48
commit c6f0705e3b

@ -111,8 +111,20 @@ for line in pre_commands.strip().splitlines():
msg = "Loaded %i commands. Type pwndbg for a list." % len(pwndbg.commands._Command.commands)
print(pwndbg.color.red(msg))
@pwndbg.memoize.reset_on_stop
cur = (gdb.selected_inferior(), gdb.selected_thread())
def prompt_hook(*a):
global cur
new = (gdb.selected_inferior(), gdb.selected_thread())
if cur != new:
pwndbg.events.after_reload()
cur = new
prompt_hook_on_stop(*a)
@pwndbg.memoize.reset_on_stop
def prompt_hook_on_stop(*a):
with pwndbg.stdio.stdio:
pwndbg.commands.context.context()

@ -1,3 +1,5 @@
import gdb
import pwndbg.arch
import pwndbg.events
import pwndbg.memory
@ -21,7 +23,11 @@ def update():
ptrsize = pwndbg.arch.ptrsize
ptrbits = 8 * ptrsize
argc = pwndbg.memory.u(sp, ptrbits)
try:
argc = pwndbg.memory.u(sp, ptrbits)
except:
return
sp += ptrsize
argv = sp

@ -110,12 +110,13 @@ def stop(func): return connect(func, gdb.events.stop, 'stop')
def start(func): return connect(func, gdb.events.start, 'start')
def after_reload():
return
# if gdb.selected_inferior().pid:
# for f in registered[gdb.events.new_objfile]:
# f()
# for f in registered[gdb.events.stop]:
# f()
if gdb.selected_inferior().pid:
for f in registered[gdb.events.start]:
f()
for f in registered[gdb.events.new_objfile]:
f()
for f in registered[gdb.events.stop]:
f()
def on_reload():
for event, functions in registered.items():

Loading…
Cancel
Save