使用GDB调试Golang?

9

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

1) Go build GCC flags 

当我执行"go build"命令时,Go构建器使用哪些gcc标志来构建程序?构建值与在go环境中设置的"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个回答

15

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}

6
已经被接受的答案已经过时了。如果您使用-gcflags=all="-N -l"标志构建,Golang目前可以与GDB(包括本地)一起使用,如官方文档所述。请注意保留HTML标记。

5

Go语言与GDB不兼容,已知问题之一是值的打印。

更多细节可以在这里找到。


谢谢,除了GDB还有什么选项吗? - python
4
这里没有其他选择 - 看看这个链接 - metakeule
@python - Delve(https://github.com/go-delve/delve) - tim-montague

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接