2014-09-20 177 views
4

我有一个gdb没有正确打印变量的问题。 简单的方案是建立在以下方式:golang 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) 

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

这是我去的版本

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

添加到@AlexAtNet的答案中,Go 1.2.x之后的所有内容都打破了GDB的支持,所以要么使用go 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.2.x的确有一招。 Gdb调试器非常漂亮地打印这些变量。另外Go运行时间源自动加载,无需每次都手动插入它们。 Go 1.3并不是必须要求我,因为我是Go world的新手,所以我很高兴。稍后将尝试查看gccgo的工作方式。谢谢! – chmurson 2014-09-21 19:17:35

1

的GDB的支持是不是为围棋队优先所以这是不可能的这样的问题的数量将固定不久。考虑以下几点:

https://golang.org/doc/gdb

GDB不明白围棋程序很好。堆栈管理,线程和运行时包含与执行模型相差甚远的方面GDB希望即使在使用gccgo编译程序时,他们也会混淆调试器。因此,虽然GDB在某些情况下很有用,但它并不是Go程序的可靠调试器,尤其是高度并发的调试器。此外,围绕这些困难的问题,Go项目并不是一个优先事项。

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

+1

根据当前时刻的gcc版本https://gcc.gnu.org/gcc-4.9/changes的最新文档。 html最多只支持Go 1.2.1。 所以我现在不得不忘掉Go 1.3 – chmurson 2014-09-21 19:14:48