Debugging 如何调试用Go语言编写的程序?
如何调试Go程序?我一直在使用,但没有调试。有没有办法逐步检查我的代码并检查内存?还是我被打印出来的报表困住了?我可以使用吗?有一个名为的实验性调试器包。不确定它工作得如何。这很不幸,但现在最好的方法是使用打印功能。内置的print和println可以正常工作,但fmt中的功能有时会更好地工作,具体取决于您所关注的信息。更新:上的文档中现在有一个官方页面。自从写下这个答案以来,情况发生了很大的变化,下面列出的一些限制已经被删除。我将把这个答案的其余部分留给后人,但是如果您想调试Go代码,请遵循上面的链接 Go链接器使gdb 7.x版可以解释的调试符号相形见绌 从上面链接的博客文章中突出显示: 你可以Debugging 如何调试用Go语言编写的程序?,debugging,go,Debugging,Go,如何调试Go程序?我一直在使用,但没有调试。有没有办法逐步检查我的代码并检查内存?还是我被打印出来的报表困住了?我可以使用吗?有一个名为的实验性调试器包。不确定它工作得如何。这很不幸,但现在最好的方法是使用打印功能。内置的print和println可以正常工作,但fmt中的功能有时会更好地工作,具体取决于您所关注的信息。更新:上的文档中现在有一个官方页面。自从写下这个答案以来,情况发生了很大的变化,下面列出的一些限制已经被删除。我将把这个答案的其余部分留给后人,但是如果您想调试Go代码,请遵循上
- 在GDB 7.x版中加载Go程序
- 按行列出所有Go、C和汇编源文件(Go运行时的部分用C和汇编编写)
- 按行设置断点并逐步遍历代码
- 打印堆栈跟踪并检查堆栈框架,以及
- 查找地址并打印大多数变量的内容
- Mac OS x附带的GDB版本6.x无法读取发出的DWARF代码。我们很乐意接受修补程序,使DWARF输出与标准OS x GDB兼容,但在修复之前,您需要下载、构建并安装GDB 7.x才能在OS x下使用它。源代码可在。由于OSX的特殊性,您需要使用chgrp procmod和chmod g+s在本地文件系统上安装二进制文件
- 名称是用包名限定的,由于GDB不理解Go包,所以您必须以其全名引用每个项。例如,包main中名为v的变量必须在单引号中称为“main.v”。这样做的结果是,变量和函数名的制表符完成不起作用
- 词法范围信息有些模糊。如果有多个相同名称的变量,则第n个实例的后缀形式为“#n”。我们计划解决这个问题,但它需要对编译器和链接器之间交换的数据进行一些更改
- 切片和字符串变量在运行库中表示为它们的底层结构。它们看起来像{data=0x2aaaab3e320,len=1,cap=1}。对于切片,必须取消引用数据指针以检查元素
- 无法检查通道、函数、接口和映射变量
- 只有Go变量使用类型信息进行注释;运行时的C变量不是
- Windows和ARM二进制文件不包含DWARF调试信息,因此无法使用GDB进行检查
- 也许一些关于GDB入门的分步说明会有所帮助
我创建了silly.go,其中包含:
package main
import "fmt"
func x() {
foo := 5
fmt.Printf("foo: %v\n", foo)
}
func main() {
go x()
fmt.Printf("Done.\n")
}
在运行8gshilly.go
和8l-oshilly.8
之后,我可以运行gdbshilly
。(据我所知,我有“GNU gdb(Ubuntu/Linaro 7.2-1ubuntu11)7.2”,它是Ubuntu 11.04 32位附带的。)
然后我可以键入list
,b7
(缩写为break 7
)和run
。它停在7号线,我可以跑:
(gdb) p foo
$1 = 5
看看Eclipse/CDT调试器和/或DDD是否能与Go一起工作,这会很有趣。正式支持Go。Go调试会话的另一个倡议: 与大多数调试器不同,hopwatch要求您在程序中感兴趣的点插入函数调用。在这些程序位置,您可以告诉Hopwatch显示变量值并挂起程序(或goroutine)。
Hopwatch使用WebSocket在程序和HTML5页面中运行的调试器之间交换命令 (因此,它仍然类似于“打印语句”,但以更优雅的方式查看结果,而不会污染
stdout
和stderr
)
当您的程序调用Break函数时,它会将调试信息发送到浏览器页面,并等待用户交互。使用功能
Display
、Printf
或Dump
(go spew
),您可以在浏览器页面上记录信息。在hopwatch页面上,开发人员可以查看调试信息并选择恢复程序的执行
正在开发另一种调试技术(2014年第4季度): 跟踪包含
- 与goroutine调度相关的事件:
- goroutine开始在处理器上执行
- 同步原语上的goroutine块
- 一个goroutine创建或取消阻止另一个goroutine李>
- 网络相关事件:
- 一个goroutine在网络IO上阻塞
- 网络IO上的goroutine未被阻止李>
- 系统调用相关事件:
- goroutine进入syscall
- goroutine从syscall返回李>
- 垃圾收集器相关事件:
- GC启动/停止
- 同步扫描启动/停止;及
- 用户事件李>
GOMAXPROCS
每个事件都包含事件id、精确的时间戳、操作系统线程id、处理器id、goroutine id、堆栈跟踪和其他相关信息(例如未阻止的goroutine id) 新倡议(2014年5月开始):现在(2021年): Delve是一个用Go编写的Go调试器
(主要是给李
$ dlv -run
$ dlv -proc path/to/program
$ sudo dlv -pid 44839