我编译了一个带有调试标志的简单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
并执行break
和break 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文件中。