]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: refactor gdb PC parsing
authorJosh Bleecher Snyder <josharian@gmail.com>
Tue, 13 Mar 2018 18:56:20 +0000 (11:56 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Thu, 15 Mar 2018 00:18:19 +0000 (00:18 +0000)
Change-Id: I91607edaf9c256e6723eb3d6e18c8210eb86b704
Reviewed-on: https://go-review.googlesource.com/100464
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
src/runtime/runtime-gdb.py

index 64e37903eb2e5005aa64e671928c1cb6a33cd466..e705435def6312f54e443ff9c1c4a49825401c0d 100644 (file)
@@ -230,6 +230,27 @@ def makematcher(klass):
 
 goobjfile.pretty_printers.extend([makematcher(var) for var in vars().values() if hasattr(var, 'pattern')])
 
+
+#
+#  Utilities
+#
+
+def pc_to_int(pc):
+       # python2 will not cast pc (type void*) to an int cleanly
+       # instead python2 and python3 work with the hex string representation
+       # of the void pointer which we can parse back into an int.
+       # int(pc) will not work.
+       try:
+               # python3 / newer versions of gdb
+               pc = int(pc)
+       except gdb.error:
+               # str(pc) can return things like
+               # "0x429d6c <runtime.gopark+284>", so
+               # chop at first space.
+               pc = int(str(pc).split(None, 1)[0], 16)
+       return pc
+
+
 #
 #  For reference, this is what we're trying to do:
 #  eface: p *(*(struct 'runtime.rtype'*)'main.e'->type_->data)->string
@@ -424,18 +445,7 @@ class GoroutinesCmd(gdb.Command):
                        if ptr['m']:
                                s = '*'
                        pc = ptr['sched']['pc'].cast(vp)
-                       # python2 will not cast pc (type void*) to an int cleanly
-                       # instead python2 and python3 work with the hex string representation
-                       # of the void pointer which we can parse back into an int.
-                       # int(pc) will not work.
-                       try:
-                               #python3 / newer versions of gdb
-                               pc = int(pc)
-                       except gdb.error:
-                               # str(pc) can return things like
-                               # "0x429d6c <runtime.gopark+284>", so
-                               # chop at first space.
-                               pc = int(str(pc).split(None, 1)[0], 16)
+                       pc = pc_to_int(pc)
                        blk = gdb.block_for_pc(pc)
                        status = int(ptr['atomicstatus'])
                        st = sts.get(status, "unknown(%d)" % status)
@@ -514,11 +524,7 @@ class GoroutineCmd(gdb.Command):
                if not pc:
                        print("No such goroutine: ", goid)
                        return
-               try:
-                       #python3 / newer versions of gdb
-                       pc = int(pc)
-               except gdb.error:
-                       pc = int(str(pc).split(None, 1)[0], 16)
+               pc = pc_to_int(pc)
                save_frame = gdb.selected_frame()
                gdb.parse_and_eval('$save_sp = $sp')
                gdb.parse_and_eval('$save_pc = $pc')