mirror of
https://github.com/golang/go
synced 2024-09-30 11:08:36 -06:00
runtime: repair gdb printing fix for 7.12, 8.{1,2,3}.1, 9.2
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>
This commit is contained in:
parent
9e56bcb9fe
commit
3949cae441
@ -28,10 +28,22 @@ if sys.version > '3':
|
|||||||
goobjfile = gdb.current_objfile() or gdb.objfiles()[0]
|
goobjfile = gdb.current_objfile() or gdb.objfiles()[0]
|
||||||
goobjfile.pretty_printers = []
|
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.
|
# Older gdb renders some types differently.
|
||||||
def oldnew(old, new):
|
def oldnew(old, new):
|
||||||
if (gdb.VERSION[0] == '7'):
|
if majorgdbversion < 8:
|
||||||
return old
|
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
|
return new
|
||||||
|
|
||||||
# G state (runtime2.go)
|
# G state (runtime2.go)
|
||||||
@ -202,7 +214,7 @@ class ChanTypePrinter:
|
|||||||
to inspect their contents with this pretty printer.
|
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):
|
def __init__(self, val):
|
||||||
self.val = val
|
self.val = val
|
||||||
|
@ -55,9 +55,7 @@ func checkGdbEnvironment(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// checkGdbVersion ensures gdb version is supported, and returns major version
|
func checkGdbVersion(t *testing.T) {
|
||||||
// to allow testing conditional on gdb version.
|
|
||||||
func checkGdbVersion(t *testing.T) int {
|
|
||||||
// Issue 11214 reports various failures with older versions of gdb.
|
// Issue 11214 reports various failures with older versions of gdb.
|
||||||
out, err := exec.Command("gdb", "--version").CombinedOutput()
|
out, err := exec.Command("gdb", "--version").CombinedOutput()
|
||||||
if err != nil {
|
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.Skipf("skipping: gdb version %d.%d too old", major, minor)
|
||||||
}
|
}
|
||||||
t.Logf("gdb version %d.%d", major, minor)
|
t.Logf("gdb version %d.%d", major, minor)
|
||||||
return major
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkGdbPython(t *testing.T) {
|
func checkGdbPython(t *testing.T) {
|
||||||
@ -170,7 +167,7 @@ func testGdbPython(t *testing.T, cgo bool) {
|
|||||||
|
|
||||||
checkGdbEnvironment(t)
|
checkGdbEnvironment(t)
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
gdbMajor := checkGdbVersion(t)
|
checkGdbVersion(t)
|
||||||
checkGdbPython(t)
|
checkGdbPython(t)
|
||||||
|
|
||||||
dir, err := ioutil.TempDir("", "go-build")
|
dir, err := ioutil.TempDir("", "go-build")
|
||||||
@ -319,16 +316,14 @@ func testGdbPython(t *testing.T, cgo bool) {
|
|||||||
t.Fatalf("print slicemap failed: %s", bl)
|
t.Fatalf("print slicemap failed: %s", bl)
|
||||||
}
|
}
|
||||||
|
|
||||||
if gdbMajor > 7 {
|
chanIntSfx := `chan int = {99, 11}`
|
||||||
chanIntSfx := `chan int = {99, 11}`
|
if bl := strings.ReplaceAll(blocks["print chanint"], " ", " "); !strings.HasSuffix(bl, chanIntSfx) {
|
||||||
if bl := strings.ReplaceAll(blocks["print chanint"], " ", " "); !strings.HasSuffix(bl, chanIntSfx) {
|
t.Fatalf("print chanint failed: %s", bl)
|
||||||
t.Fatalf("print chanint failed: %s", bl)
|
}
|
||||||
}
|
|
||||||
|
|
||||||
chanStrSfx := `chan string = {"spongepants", "squarebob"}`
|
chanStrSfx := `chan string = {"spongepants", "squarebob"}`
|
||||||
if bl := strings.ReplaceAll(blocks["print chanstr"], " ", " "); !strings.HasSuffix(bl, chanStrSfx) {
|
if bl := strings.ReplaceAll(blocks["print chanstr"], " ", " "); !strings.HasSuffix(bl, chanStrSfx) {
|
||||||
t.Fatalf("print chanstr failed: %s", bl)
|
t.Fatalf("print chanstr failed: %s", bl)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
strVarRe := regexp.MustCompile(`^\$[0-9]+ = (0x[0-9a-f]+\s+)?"abc"$`)
|
strVarRe := regexp.MustCompile(`^\$[0-9]+ = (0x[0-9a-f]+\s+)?"abc"$`)
|
||||||
@ -407,7 +402,7 @@ func TestGdbBacktrace(t *testing.T) {
|
|||||||
|
|
||||||
checkGdbEnvironment(t)
|
checkGdbEnvironment(t)
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
_ = checkGdbVersion(t)
|
checkGdbVersion(t)
|
||||||
|
|
||||||
dir, err := ioutil.TempDir("", "go-build")
|
dir, err := ioutil.TempDir("", "go-build")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -481,7 +476,7 @@ func main() {
|
|||||||
func TestGdbAutotmpTypes(t *testing.T) {
|
func TestGdbAutotmpTypes(t *testing.T) {
|
||||||
checkGdbEnvironment(t)
|
checkGdbEnvironment(t)
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
_ = checkGdbVersion(t)
|
checkGdbVersion(t)
|
||||||
|
|
||||||
if runtime.GOOS == "aix" && testing.Short() {
|
if runtime.GOOS == "aix" && testing.Short() {
|
||||||
t.Skip("TestGdbAutotmpTypes is too slow on aix/ppc64")
|
t.Skip("TestGdbAutotmpTypes is too slow on aix/ppc64")
|
||||||
@ -554,7 +549,7 @@ func main() {
|
|||||||
func TestGdbConst(t *testing.T) {
|
func TestGdbConst(t *testing.T) {
|
||||||
checkGdbEnvironment(t)
|
checkGdbEnvironment(t)
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
_ = checkGdbVersion(t)
|
checkGdbVersion(t)
|
||||||
|
|
||||||
dir, err := ioutil.TempDir("", "go-build")
|
dir, err := ioutil.TempDir("", "go-build")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -621,7 +616,7 @@ func crash() {
|
|||||||
func TestGdbPanic(t *testing.T) {
|
func TestGdbPanic(t *testing.T) {
|
||||||
checkGdbEnvironment(t)
|
checkGdbEnvironment(t)
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
_ = checkGdbVersion(t)
|
checkGdbVersion(t)
|
||||||
|
|
||||||
dir, err := ioutil.TempDir("", "go-build")
|
dir, err := ioutil.TempDir("", "go-build")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -699,7 +694,7 @@ func TestGdbInfCallstack(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
_ = checkGdbVersion(t)
|
checkGdbVersion(t)
|
||||||
|
|
||||||
dir, err := ioutil.TempDir("", "go-build")
|
dir, err := ioutil.TempDir("", "go-build")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user