Commit 8141ceb36a for qemu.org
commit 8141ceb36a4699872d12594633ddbbdb962d38a6
Author: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
Date: Tue Aug 4 18:17:35 2026 +0300
scripts/qemugdb: coroutine: Fix selected frame leak on error path
Currently, whenever gdb.execute() fails and throws an exception,
previously selected frame gets leaked. I.e.:
(gdb) frame N
(gdb) qemu bt # throws exception
(gdb) frame # shows 0, not N
As a fix, wrap gdb.execute() commands in try/finally, so that selected
frame gets restored no matter what.
Fixes: 4cbf8efc5b89 ("scripts/gdb: fix 'qemu coroutine' when users selects a non topmost stack frame")
Signed-off-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
Message-ID: <20260804151743.937694-2-andrey.drobyshev@virtuozzo.com>
Tested-by: Fabiano Rosas <farosas@suse.de>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
diff --git a/scripts/qemugdb/coroutine.py b/scripts/qemugdb/coroutine.py
index 29f57ae84e..d1e6722d14 100644
--- a/scripts/qemugdb/coroutine.py
+++ b/scripts/qemugdb/coroutine.py
@@ -265,18 +265,21 @@ def dump_backtrace_live(regs):
selected_frame = gdb.selected_frame()
gdb.newest_frame().select()
- for i in regs:
- old[i] = gdb.parse_and_eval('(uint64_t)$%s' % i)
-
- for i in regs:
- gdb.execute('set $%s = %s' % (i, regs[i]))
-
- gdb.execute('bt')
+ try:
+ for i in regs:
+ old[i] = gdb.parse_and_eval('(uint64_t)$%s' % i)
- for i in regs:
- gdb.execute('set $%s = %s' % (i, old[i]))
+ for i in regs:
+ gdb.execute('set $%s = %s' % (i, regs[i]))
- selected_frame.select()
+ gdb.execute('bt')
+ finally:
+ try:
+ for i in old:
+ gdb.execute('set $%s = %s' % (i, old[i]))
+ finally:
+ # restore previously selected frame in any case
+ selected_frame.select()
def bt_jmpbuf(jmpbuf, detailed=False):
'''Backtrace a jmpbuf'''