]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: repair gdb printing fix for 7.12, 8.{1,2,3}.1, 9.2
authorDavid Chase <drchase@google.com>
Tue, 2 Jun 2020 21:53:47 +0000 (17:53 -0400)
committerDavid Chase <drchase@google.com>
Wed, 3 Jun 2020 16:27:49 +0000 (16:27 +0000)
Hand-verified for listed gdb versions.  Gdb (apparently)
changed the way it names certain Go types, and this change
broke the pretty-printer-activating code in runtime-gdb.py

runtime-gdb_test.go now checks channel, map, string, and slice
printing unconditionally (i.e., no opt-out for old versions).

Updates #39368.

Change-Id: I98d72e1291c66bd40d970990e1a377ff2ed0c5d2
Reviewed-on: https://go-review.googlesource.com/c/go/+/236164
Run-TryBot: David Chase <drchase@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/runtime/runtime-gdb.py
src/runtime/runtime-gdb_test.go

index b883d87f2db60ab5c0e2870847c8a3d4f82eae99..7b5ba71832a4907db883457f1c190a668a8132fa 100644 (file)
@@ -28,10 +28,22 @@ 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 (gdb.VERSION[0] == '7'):
+  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)
@@ -202,7 +214,7 @@ class ChanTypePrinter:
        to inspect their contents with this pretty printer.
        """
 
-       pattern = re.compile(oldnew(r'^struct hchan<.*>$',r'^chan '))
+       pattern = re.compile(r'^chan ')
 
        def __init__(self, val):
                self.val = val
index f1ff51dad081c8a71284aead914120f5c21f0352..e52bd1c4c48a585f63d3c7a74aac95da9cf9b58f 100644 (file)
@@ -55,9 +55,7 @@ func checkGdbEnvironment(t *testing.T) {
        }
 }
 
-// checkGdbVersion ensures gdb version is supported, and returns major version
-// to allow testing conditional on gdb version.
-func checkGdbVersion(t *testing.T) int {
+func checkGdbVersion(t *testing.T) {
        // Issue 11214 reports various failures with older versions of gdb.
        out, err := exec.Command("gdb", "--version").CombinedOutput()
        if err != nil {
@@ -77,7 +75,6 @@ func checkGdbVersion(t *testing.T) int {
                t.Skipf("skipping: gdb version %d.%d too old", major, minor)
        }
        t.Logf("gdb version %d.%d", major, minor)
-       return major
 }
 
 func checkGdbPython(t *testing.T) {
@@ -170,7 +167,7 @@ func testGdbPython(t *testing.T, cgo bool) {
 
        checkGdbEnvironment(t)
        t.Parallel()
-       gdbMajor := checkGdbVersion(t)
+       checkGdbVersion(t)
        checkGdbPython(t)
 
        dir, err := ioutil.TempDir("", "go-build")
@@ -319,16 +316,14 @@ func testGdbPython(t *testing.T, cgo bool) {
                t.Fatalf("print slicemap failed: %s", bl)
        }
 
-       if gdbMajor > 7 {
-               chanIntSfx := `chan int = {99, 11}`
-               if bl := strings.ReplaceAll(blocks["print chanint"], "  ", " "); !strings.HasSuffix(bl, chanIntSfx) {
-                       t.Fatalf("print chanint failed: %s", bl)
-               }
+       chanIntSfx := `chan int = {99, 11}`
+       if bl := strings.ReplaceAll(blocks["print chanint"], "  ", " "); !strings.HasSuffix(bl, chanIntSfx) {
+               t.Fatalf("print chanint failed: %s", bl)
+       }
 
-               chanStrSfx := `chan string = {"spongepants", "squarebob"}`
-               if bl := strings.ReplaceAll(blocks["print chanstr"], "  ", " "); !strings.HasSuffix(bl, chanStrSfx) {
-                       t.Fatalf("print chanstr failed: %s", bl)
-               }
+       chanStrSfx := `chan string = {"spongepants", "squarebob"}`
+       if bl := strings.ReplaceAll(blocks["print chanstr"], "  ", " "); !strings.HasSuffix(bl, chanStrSfx) {
+               t.Fatalf("print chanstr failed: %s", bl)
        }
 
        strVarRe := regexp.MustCompile(`^\$[0-9]+ = (0x[0-9a-f]+\s+)?"abc"$`)
@@ -407,7 +402,7 @@ func TestGdbBacktrace(t *testing.T) {
 
        checkGdbEnvironment(t)
        t.Parallel()
-       _ = checkGdbVersion(t)
+       checkGdbVersion(t)
 
        dir, err := ioutil.TempDir("", "go-build")
        if err != nil {
@@ -481,7 +476,7 @@ func main() {
 func TestGdbAutotmpTypes(t *testing.T) {
        checkGdbEnvironment(t)
        t.Parallel()
-       _ = checkGdbVersion(t)
+       checkGdbVersion(t)
 
        if runtime.GOOS == "aix" && testing.Short() {
                t.Skip("TestGdbAutotmpTypes is too slow on aix/ppc64")
@@ -554,7 +549,7 @@ func main() {
 func TestGdbConst(t *testing.T) {
        checkGdbEnvironment(t)
        t.Parallel()
-       _ = checkGdbVersion(t)
+       checkGdbVersion(t)
 
        dir, err := ioutil.TempDir("", "go-build")
        if err != nil {
@@ -621,7 +616,7 @@ func crash() {
 func TestGdbPanic(t *testing.T) {
        checkGdbEnvironment(t)
        t.Parallel()
-       _ = checkGdbVersion(t)
+       checkGdbVersion(t)
 
        dir, err := ioutil.TempDir("", "go-build")
        if err != nil {
@@ -699,7 +694,7 @@ func TestGdbInfCallstack(t *testing.T) {
        }
 
        t.Parallel()
-       _ = checkGdbVersion(t)
+       checkGdbVersion(t)
 
        dir, err := ioutil.TempDir("", "go-build")
        if err != nil {