[PATCH 1/9] scripts/qemugdb: coroutine: Fix selected frame leak on error path
Andrey Drobyshev <[email protected]> Tue, 4 Aug 2026 18:17:35 +0300
| Newsgroups | gmane.comp.emulators.qemu |
|---|---|
| Message-ID | <[email protected]> |
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 <[email protected]>
---
scripts/qemugdb/coroutine.py | 23 +++++++++++++----------
1 file changed, 13 insertions(+), 10 deletions(-)
diff --git a/scripts/qemugdb/coroutine.py b/scripts/qemugdb/coroutine.py
index 29f57ae84ed..d1e6722d14d 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'''
--
2.47.1