GDB-连接并中断正在运行的Go应用程序



我编译了一个带有调试标志的简单go应用程序:

go build -gcflags "-N -l" -o main main.go

main.go

package main
import (
    "fmt"
    "time"
)
func main() {
    for i := 0; true; i++ {
        fmt.Println("number:", i)
        time.Sleep(time.Second)
    }
}

在gdb中,我附加到它的pid并执行breakbreak 11

gdb --pid=<pid>

Gdb报告说断点已经成功设置,但它们永远不会被击中。有办法让它发挥作用吗?

注意:同样的设置(即使在将runtime-gdb.py添加到.gdbrc时)也有可能无法与Ubuntu 13.10一起使用,在那里你会得到一个"CCD_ 8";消息,如图所示:

  • 博客文章";使用GDB在Ubuntu 13.10上调试Go 1.2;来自Michael Susens Schurter(schmichael
  • issue 6698(gdb:升级为python 3兼容)

问题是Ubuntu13.10将GDB链接到Python3.3,而golang提供的脚本是用于Python2。有人已经提交了一个问题,而且它似乎在上游得到了解决(所以预计Go 1.3 to Just Work)。

幸运的是,移植修复程序很容易。只需将现有的runtime-gdb.py移开,并在其位置下载上游版本。

如果你的$GOROOT/usr/local/go,以下应该只是工作:

sudo mv /usr/local/go/src/pkg/runtime/runtime-gdb.py /usr/local/go/src/pkg/runtime/runtime-gdb.py.orig
cd /usr/local/go/src/pkg/runtime/
sudo wget https://go.googlecode.com/hg/src/pkg/runtime/runtime-gdb.py

go/src/pkg/runtime/runtime-gdb.py脚本需要加载到gdb中才能有效地调试go程序。

您可以将其添加到.gdbrc文件中。

最新更新