From 048988a0f14f74c0a27efe93699221bc49b7873c Mon Sep 17 00:00:00 2001 From: Lynn Boger Date: Tue, 4 Dec 2018 15:15:27 -0500 Subject: [PATCH] runtime: fix runtime-gdb.py when switching sp value 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 Reviewed-by: Austin Clements TryBot-Result: Gobot Gobot --- src/runtime/runtime-gdb.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/runtime/runtime-gdb.py b/src/runtime/runtime-gdb.py index 510c08c286..4c32c633cf 100644 --- a/src/runtime/runtime-gdb.py +++ b/src/runtime/runtime-gdb.py @@ -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() -- 2.50.0