golang gdb - 打印变量

时间:2014-09-20 16:25:00

标签: python go gdb

我有一个问题,gdb无法正确打印变量。 简单程序以下列方式构建:

chmurson-osx:helloworld chmurson$ go build -gcflags '-N' start.go 

然后gdb执行:

chmurson-osx:helloworld chmurson$ gdb start -d $GOROOT
GNU gdb (GDB) 7.8
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin14.0.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from start...done.
warning: Missing auto-load scripts referenced in section .debug_gdb_scripts
of file /Users/chmurson/Dev/goprojects/misc/src/helloworld/start
Use `info auto-load python-scripts [REGEXP]' to list them.
(gdb) 
(gdb) source /usr/local/go/src/pkg/runtime/runtime-gdb.py
Loading Go Runtime support.

以下是我接下来要做的事情:

(gdb) list
1   package main
2   
3   import "fmt"
4   
5   func main() {
6       x := "abc"
7       i := 3
8       fmt.Println(i)
9       fmt.Println(x)
10  }
(gdb) b 9
Breakpoint 1 at 0x2106: file /Users/chmurson/Dev/goprojects/misc/src/helloworld/start.go, line 9.
(gdb) run
Starting program: /Users/chmurson/Dev/goprojects/misc/src/helloworld/start 
3
[New Thread 0x1113 of process 14039]

Breakpoint 1, main.main () at /Users/chmurson/Dev/goprojects/misc/src/helloworld/start.go:9
9       fmt.Println(x)
(gdb) p x
Python Exception <type 'exceptions.OverflowError'> signed integer is greater than maximum: 
$1 = 
(gdb) p i
$2 = 8725692800
(gdb) 

你可以看到在检查&#39; p&#39;时有Python异常。变量,当显示&#39; i的值时,完全不是3。怎么了?

这是我的go版本

chmurson-osx:helloworld chmurson$ go version
go version go1.3.1 darwin/amd64

和gdb配置

(gdb) show configuration
This GDB was configured as follows:
   configure --host=x86_64-apple-darwin14.0.0 --target=x86_64-apple-darwin14.0.0
             --with-auto-load-dir=:${prefix}/share/auto-load
             --with-auto-load-safe-path=:${prefix}/share/auto-load
             --with-expat
             --with-gdb-datadir=/usr/local/share/gdb (relocatable)
             --with-jit-reader-dir=/usr/local/lib/gdb (relocatable)
             --without-libunwind-ia64
             --without-lzma
             --with-python=/System/Library/Frameworks/Python.framework/Versions/2.7
             --without-guile
             --with-separate-debug-dir=/usr/local/lib/debug (relocatable)
             --with-zlib
             --without-babeltrace

("Relocatable" means the directory can be moved with the GDB installation
tree, and GDB will still find it.)

2 个答案:

答案 0 :(得分:2)

添加到@ AlexAtNet的答案,Go 1.2.x之后的所有内容都打破了GDB支持,所以要么使用去1.2.x进行调试或使用gccgo(请记住gcc 4.8.x支持go 1.1,gcc 4.9 .x高达1.2)。

另一个选择是使用你自己的跟踪功能,不是很漂亮,但它目前是1.3 +的唯一真正的调试选项。

我个人使用这样的东西进行调试:

var traceLock sync.Mutex

func trace(a ...interface{}) {
    traceLock.Lock()
    pc, f, ln, ok := runtime.Caller(1)
    fn := ""
    if ok {
        fn = runtime.FuncForPC(pc).Name()
    }
    fmt.Printf("trace: %s %s:%d", fn, filepath.Base(f), ln)
    if len(a) > 0 {
        fmt.Println(append([]interface{}{": "}, a...)...)
    }
    traceLock.Unlock()
}

playground

答案 1 :(得分:1)

GDB支持不是Go团队的优先事项,因此不太可能很快解决此类问题的数量。请考虑以下事项:

https://golang.org/doc/gdb

  

GDB不了解Go程序。堆栈管理,线程和运行时包含与执行模型不同的方面,GDB期望它们可以混淆调试器,即使程序是使用gccgo编译的。因此,尽管GDB在某些情况下很有用,但它并不是Go程序的可靠调试器,特别是大量并发的程序。此外,Go项目不是解决这些难以解决的问题的优先事项。

但是,您可以使用Gccgo工具链并成功调试go程序。但是,在Mac上安装它有点麻烦。