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'''