summaryrefslogtreecommitdiffstats
path: root/scripts/qemugdb
diff options
context:
space:
mode:
authorMaxim Levitsky2020-12-17 16:54:35 +0100
committerPaolo Bonzini2021-01-12 12:38:03 +0100
commit4cbf8efc5b894f9dd86867d7e3de8e8f190618c4 (patch)
tree51792dae23a6def2523e0614ac49fe51655bb2af /scripts/qemugdb
parentmeson: fix Cocoa option in summary (diff)
downloadqemu-4cbf8efc5b894f9dd86867d7e3de8e8f190618c4.tar.gz
qemu-4cbf8efc5b894f9dd86867d7e3de8e8f190618c4.tar.xz
qemu-4cbf8efc5b894f9dd86867d7e3de8e8f190618c4.zip
scripts/gdb: fix 'qemu coroutine' when users selects a non topmost stack frame
The code that dumps the stack frame works like that: * save current registers * overwrite current registers (including rip/rsp) with coroutine snapshot in the jmpbuf * print backtrace * restore the saved registers. If the user has currently selected a non topmost stack frame in gdb, the above code will still restore the selected frame registers, but the gdb will then lose the selected frame index, which makes it impossible to switch back to frame 0, to continue debugging the executable. Therefore switch temporarily to the topmost frame of the stack for the above code. Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Message-Id: <20201217155436.927320-2-mlevitsk@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'scripts/qemugdb')
-rw-r--r--scripts/qemugdb/coroutine.py7
1 files changed, 7 insertions, 0 deletions
diff --git a/scripts/qemugdb/coroutine.py b/scripts/qemugdb/coroutine.py
index db61389022..e1399211e6 100644
--- a/scripts/qemugdb/coroutine.py
+++ b/scripts/qemugdb/coroutine.py
@@ -70,6 +70,11 @@ def bt_jmpbuf(jmpbuf):
regs = get_jmpbuf_regs(jmpbuf)
old = dict()
+ # remember current stack frame and select the topmost
+ # so that register modifications don't wreck it
+ selected_frame = gdb.selected_frame()
+ gdb.newest_frame().select()
+
for i in regs:
old[i] = gdb.parse_and_eval('(uint64_t)$%s' % i)
@@ -81,6 +86,8 @@ def bt_jmpbuf(jmpbuf):
for i in regs:
gdb.execute('set $%s = %s' % (i, old[i]))
+ selected_frame.select()
+
def coroutine_to_jmpbuf(co):
coroutine_pointer = co.cast(gdb.lookup_type('CoroutineUContext').pointer())
return coroutine_pointer['env']['__jmpbuf']