]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: make runtime-gdb.py tolerant of creatively-named gdb versions
authorDavid Chase <drchase@google.com>
Wed, 3 Jun 2020 18:21:18 +0000 (14:21 -0400)
committerDavid Chase <drchase@google.com>
Wed, 3 Jun 2020 22:07:42 +0000 (22:07 +0000)
"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>

src/runtime/runtime-gdb.py

index 7b5ba71832a4907db883457f1c190a668a8132fa..8d96dfb6094ae077734592528db84afcc36d1feb 100644 (file)
@@ -28,24 +28,6 @@ if sys.version > '3':
 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 @@ class SliceValue:
 #  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 StringTypePrinter:
 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 @@ class SliceTypePrinter:
                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)