golang gdb - 打印变量 [英] golang gdb - print variables

查看:778
本文介绍了golang gdb - 打印变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个问题,gdb不能正确打印变量。
简单程序的构建方式如下:

I have a problem with gdb not printing variables correctly. Simple program is build in following way:

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

然后执行gdb:

And then gdb executed:

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.

接下来我要做的是:

Here is what I do next:

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

您可以看到在检查'p'变量时有Python异常,显示'i'的值时完全不是3。有什么不对?

You can see that there is Python Exception on examination of 'p' variable, and totally not 3 when displaying value of 'i'. What's wrong ?

这是我的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.)


推荐答案

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

Adding to @AlexAtNet's answer, everything after Go 1.2.x breaks GDB support, so either use go 1.2.x for debugging or use gccgo (keep in mind that gcc 4.8.x supports go 1.1, gcc 4.9.x is up to 1.2).

另一种选择是使用自己的跟踪函数,但并不漂亮,但它目前是1.3 +的唯一真正的调试选项。

Another option is to use your own trace function, not pretty but it's currently the only real debug option for go 1.3+.

我个人使用类似用于调试:

I personally use something like this for debugging:

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

这篇关于golang gdb - 打印变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆