1
0
mirror of https://github.com/golang/go synced 2024-09-30 09:38:38 -06:00

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>
This commit is contained in:
David Chase 2020-06-03 14:21:18 -04:00
parent 23dcee6464
commit 429d2c548d

View 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)