]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix runtime-gdb.py when switching sp value
authorLynn Boger <laboger@linux.vnet.ibm.com>
Tue, 4 Dec 2018 20:15:27 +0000 (15:15 -0500)
committerLynn Boger <laboger@linux.vnet.ibm.com>
Fri, 7 Dec 2018 17:11:55 +0000 (17:11 +0000)
After a recent change to runtime-gdb_test.go the ppc64le builder
has had intermittent failures. The failures occur when trying to
invoke the goroutineCmd function to display the backtrace for
a selected goroutine. There is nothing wrong with the testcase
but it seems to intermittently leave goroutines in a state
where an error can occur.

The error message indicates that the problem occurs when trying
to change the sp back to the original after displaying the
stacktrace for the goroutine.

gdb.error: Attempt to assign to an unmodifiable value.

After some searching I found that this error message can happen
if the sp register is changed when on a frame that is not the
top-most frame. To fix the problem, frame 0 is selected before
changing the value of sp. This fixes the problem in my
reproducer environment, and hopefully will fix the problem on
the builder.

Updates #28679

Change-Id: I329bc95b30f8c95acfb161b0d9cfdcbd917a1954
Reviewed-on: https://go-review.googlesource.com/c/152540
Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com>
Reviewed-by: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/runtime/runtime-gdb.py

index 510c08c286ca02d02f67c8a78e29f9d15b889a10..4c32c633cf1f1d3fd00bf3d4c5bc93c8ff450dc8 100644 (file)
@@ -528,11 +528,17 @@ class GoroutineCmd(gdb.Command):
                save_frame = gdb.selected_frame()
                gdb.parse_and_eval('$save_sp = $sp')
                gdb.parse_and_eval('$save_pc = $pc')
+               # In GDB, assignments to sp must be done from the
+               # top-most frame, so select frame 0 first.
+               gdb.execute('select-frame 0')
                gdb.parse_and_eval('$sp = {0}'.format(str(sp)))
                gdb.parse_and_eval('$pc = {0}'.format(str(pc)))
                try:
                        gdb.execute(cmd)
                finally:
+                       # In GDB, assignments to sp must be done from the
+                       # top-most frame, so select frame 0 first.
+                       gdb.execute('select-frame 0')
                        gdb.parse_and_eval('$sp = $save_sp')
                        gdb.parse_and_eval('$pc = $save_pc')
                        save_frame.select()