代码之家  ›  专栏  ›  技术社区  ›  rook

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

  •  40
  • rook  · 技术社区  · 14 年前

    如何调试Go程序?我一直在用 Gedit Go IDE ,但它没有调试。有没有一种方法可以逐步检查我的代码并检查内存?还是我一直在打印报表?我能用吗 OutputDebugString ?

    9 回复  |  直到 14 年前
        1
  •  22
  •   nmichaels    11 年前

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

    Go链接器 now emit 可以由gdbversion7.x解释的矮化调试符号。

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

    • 按行列出所有Go、C和assembly源文件(Go运行时的一部分是用C和assembly编写的),
    • 按行设置断点并逐步遍历代码,
    • 打印堆栈跟踪并检查堆栈帧,以及

    还有一些不便之处:

    • http://sourceware.org/gdb/download/ . 由于OSX的特殊性,您需要使用chgrp procmod和chmod g+s在本地文件系统上安装二进制文件。
    • 名称是用包名限定的,由于GDB不理解Go包,您必须用其全名引用每个项。例如,包main中名为v的变量必须用单引号引用为“main.v”。这样做的结果是变量和函数名的制表符完成不起作用。
    • Slice和string变量在运行库中表示为它们的底层结构。它们看起来像{data=0x2aaaab3e320,len=1,cap=1}。对于切片,必须取消对数据指针的引用以检查元素。

    • Windows和ARM二进制文件不包含DWARF调试信息,因此不能用GDB检查。
        2
  •  13
  •   VonC    9 年前

    derekparker/delve

    钻研是一门学问 Go调试器,用Go编写
    未知的 supported in 2016

    特征

    • 启动进程并开始调试会话
    • 设置断点、单步、单步函数、打印变量内容

    用法

    调试器可以通过三种方式启动:

    一步编译、运行和附加:

    $ dlv -run
    

    提供要调试的程序的名称,调试器将为您启动它。

    $ dlv -proc path/to/program
    

    提供当前运行进程的pid,调试器将附加并开始会话。

    $ sudo dlv -pid 44839
    

    断点

    Delve可以在调试会话中通过breakpoint命令插入断点,但是为了便于调试,还可以调用 runtime.Breakpoint() 而Delve将处理断点并在下一个源代码行停止程序。

        3
  •  9
  •   VonC    12 年前

    hopwatch

    与大多数调试器不同,hopwatch要求您在程序中感兴趣的点插入函数调用。在这些程序位置,您可以告诉Hopwatch显示变量值并挂起程序(或goroutine)。
    Hopwatch使用Websockets在程序和运行在HTML5页面上的调试器之间交换命令。

    (因此,它仍然类似于“打印声明”,但以更优雅的方式查看结果,而不会造成污染。) stdout stderr )

    hopwatch

    当您的程序调用Break函数时,它会将调试信息发送到浏览器页面并等待用户交互。
    Display Printf Dump ( go-spew

    with source

        4
  •  8
  •   Daryl Spitzer    14 年前

    也许一些逐步开始使用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")
    }
    

    运行后 8g silly.go 8l -o silly silly.8 ,我可以跑了 gdb silly

    list , b 7 (缩写为 break 7 ),和 run . 它停在7号线,我可以跑:

    (gdb) p foo
    $1 = 5
    

    看看Eclipse/CDT调试器和/或DDD是否可以与Go一起工作是很有趣的。

        5
  •  5
  •   jameshfisher    10 年前

    GDB 7.5 官方支持围棋。

        6
  •  3
  •   Annie    14 年前

    有一个名为 ogle . 不知道效果如何。

        7
  •  3
  •   Evan Shaw    14 年前

    这很不幸,但现在最好的方法是使用打印功能。内置的print和println可以工作,但是fmt中的函数有时会更好地工作,这取决于您需要什么信息。

        8
  •  3
  •   VonC    10 年前

    正在开发的另一种调试技术(2014年第4季度): Go Execution Tracer

    跟踪包含

    • 与goroutine调度相关的事件
      • goroutine开始在处理器上执行,
      • 同步原语上的goroutine块,
    • 网络相关事件
      • 一个goroutine在网络IO上被解锁;
    • 系统调用相关事件
      • goroutine从syscall返回;
    • 垃圾收集器相关事件 :
      • GC启动/停止,
      • 并行扫描启动/停止;和
    • 用户事件 .

    GOMAXPROCS .
    每个事件都包含事件id、精确的时间戳、操作系统线程id、处理器id、goroutine id、堆栈跟踪和其他相关信息(例如,未阻塞的goroutine id)。

    https://lh5.googleusercontent.com/w0znUT_0_xbipG_UlQE5Uc4PbC8Mw1duHRLg_AKTOS4iS6emOD6jnQvSDACybOfCbuSqr2ulkxULXGOBQpZ2IejPHW_8NHufqmn8q5u-fF_MSMCEgu6FwLNtMvowbq74nA

        9
  •  1
  •   Pang Ajmal PraveeN    5 年前

    去拿那个 JetBrains Toolbox