runtime: make runtime-gdb.py tolerant of creatively-named gdb versions
"Fedora" and "Red Hat" are not numbers, it turns out.
Don't rely on version numbers, instead use a regexp to
handle variation across the 2 patterns thus far observed
for gdb-generated Go type names.
Change-Id: I18c81aa2848265a47daf1180d8f6678566ae3f19
Reviewed-on: https://go-review.googlesource.com/c/go/+/236280
Reviewed-by: Austin Clements <austin@google.com>
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/src/runtime/runtime-gdb.py b/src/runtime/runtime-gdb.py
index 7b5ba71..8d96dfb 100644
--- a/src/runtime/runtime-gdb.py
+++ b/src/runtime/runtime-gdb.py
@@ -28,24 +28,6 @@
goobjfile = gdb.current_objfile() or gdb.objfiles()[0]
goobjfile.pretty_printers = []
-# A bit of hand optimization since oldnew is used for slice printing
-splitgdbversion = gdb.VERSION.split('.')
-majorgdbversion = int(splitgdbversion[0])
-
-# Older gdb renders some types differently.
-def oldnew(old, new):
- if majorgdbversion < 8:
- return old
- if majorgdbversion > 8:
- return new
- try:
- # Minor versions need not be actual numbers, e.g., 7.3a.
- if int(splitgdbversion[1]) < 2:
- return old
- except Exception:
- return new # All the existing gdb 8.minor versions are numbers, so if it is not a number, it is new.
- return new
-
# G state (runtime2.go)
def read_runtime_const(varname, default):
@@ -117,11 +99,11 @@
# Pretty Printers
#
-
+# The patterns for matching types are permissive because gdb 8.2 switched to matching on (we think) typedef names instead of C syntax names.
class StringTypePrinter:
"Pretty print Go strings."
- pattern = re.compile(oldnew(r'^struct string( \*)?$',r'^string$'))
+ pattern = re.compile(r'^(struct string( \*)?|string)$')
def __init__(self, val):
self.val = val
@@ -137,7 +119,7 @@
class SliceTypePrinter:
"Pretty print slices."
- pattern = re.compile(oldnew(r'^struct \[\]',r'^\[\]'))
+ pattern = re.compile(r'^(struct \[\]|\[\])')
def __init__(self, val):
self.val = val
@@ -146,7 +128,10 @@
return 'array'
def to_string(self):
- return str(self.val.type)[oldnew(6,0):] # skip 'struct ' for old gdb
+ t = str(self.val.type)
+ if (t.startswith("struct ")):
+ return t[len("struct "):]
+ return t
def children(self):
sval = SliceValue(self.val)