Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 如何调试用Go语言编写的程序?_Debugging_Go - Fatal编程技术网

Debugging 如何调试用Go语言编写的程序?

Debugging 如何调试用Go语言编写的程序?,debugging,go,Debugging,Go,如何调试Go程序?我一直在使用,但没有调试。有没有办法逐步检查我的代码并检查内存?还是我被打印出来的报表困住了?我可以使用吗?有一个名为的实验性调试器包。不确定它工作得如何。这很不幸,但现在最好的方法是使用打印功能。内置的print和println可以正常工作,但fmt中的功能有时会更好地工作,具体取决于您所关注的信息。更新:上的文档中现在有一个官方页面。自从写下这个答案以来,情况发生了很大的变化,下面列出的一些限制已经被删除。我将把这个答案的其余部分留给后人,但是如果您想调试Go代码,请遵循上

如何调试Go程序?我一直在使用,但没有调试。有没有办法逐步检查我的代码并检查内存?还是我被打印出来的报表困住了?我可以使用吗?

有一个名为的实验性调试器包。不确定它工作得如何。

这很不幸,但现在最好的方法是使用打印功能。内置的print和println可以正常工作,但fmt中的功能有时会更好地工作,具体取决于您所关注的信息。

更新:上的文档中现在有一个官方页面。自从写下这个答案以来,情况发生了很大的变化,下面列出的一些限制已经被删除。我将把这个答案的其余部分留给后人,但是如果您想调试Go代码,请遵循上面的链接

Go链接器使gdb 7.x版可以解释的调试符号相形见绌

从上面链接的博客文章中突出显示:

你可以

  • 在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