使用GDB进行Golang调试?

时间:2014-09-02 03:32:38

标签: go gdb

我有2个关于GDB + golang的问题?

1) Go build GCC flags 

当我跑步"去建立" ,Go构建器用来构建程序的gcc标志?构建值与" GOGCCFLAGS"相同。设置在环境中?

GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fno-common"

因为我没有看到任何" -g"或" -g3"用于添加代码符号的标志。如果是,如何编译符号表?

2)如何在GDB中打印值     我按照这里的教程GDB debug go tutorial,但似乎价值不是我设定的。

The value print 1, while actual is 1024

顺便说一句,我注意到有一篇关于它的帖子gdb debug go    但是,对我来说也不起作用。 the value is not what I set

3 个答案:

答案 0 :(得分:10)

Golang现在可以很好地使用GDB

以下是golang应用gdbtest

的示例
- gdbtest/
  - main.go

采用以下示例 main.go

package main

import "fmt"

type MyStruct struct {
    x string
    i int
    f float64
}

func main() {
    x := "abc"
    i := 3
    fmt.Println(i)
    fmt.Println(x)

    ms := &MyStruct{
        x: "cba",
        i: 10,
        f: 11.10335,
    }
    fmt.Println(ms)
}

将其保存到 main.go 。然后使用以下gcflag标志进行编译。

go build -gcflags "-N"

使用新构建的golang应用程序打开gdb

gdb gdbtest
# or 
gdb <PROJECT_NAME>

您现在可以完全控制gdb。例如,使用br <linenumber>命令添加断点,然后使用run

执行应用程序
(gdb) br 22
Breakpoint 1 at 0x2311: file /go/src/github.com/cevaris/gdbtest/main.go, line 22.
(gdb) run
Starting program: /go/src/github.com/cevaris/gdbtest/gdbtest
3
abc

Breakpoint 1, main.main () at /go/src/github.com/cevaris/gdbtest/main.go:22
22              fmt.Println(ms)
(gdb)

现在您可以打印所有局部变量

(gdb) info locals
i = 3
ms = 0x20819e020
x = 0xdb1d0 "abc"

甚至可以访问指针

(gdb) p ms
$1 = (struct main.MyStruct *) 0x20819e020
(gdb) p *ms
$2 = {x = 0xdb870 "cba", i = 10, f = 11.103350000000001}

答案 1 :(得分:5)

Go与GDB不兼容,其中一个已知问题是打印值。

可以找到更多详细信息here

答案 2 :(得分:0)

接受的答案已过时。 如果您使用official documentation

中所述的标志-gcflags=all="-N -l"进行构建,则Golang当前可与GDB(包括本地人)一起使用。