godebug是一个跨平台的Go程序调试工具,传统的编译型语言调试器使用底层系统调用并读取二进制文件用于调试各类符号。使用起来很麻烦而且很难移植。

godebug使用不同的方法,直接把源码作为目标程序,在每一行插入调试代码,然后编译并运行。结果就是一个全功能的调试器,完全可以移植到不同平台。事实上,由于有了gopherjs ,你也可以在浏览器上进行调试:



点击此处尝试原文调试窗口。通过原文的“DEBUG IT”按钮,你可以编辑程序并重新调试它。

工作原理

下面这张是描述上面例子的矢量图:



从中可以看出原始代码转换了两次:第一次godebug插入调试instrumentation,然后gopherjs将结果编译成JavaScript。

让我们看一下instrumentation步骤,以下是godebug插入的调用:
  • godebug.EnterFunc:让godebug运行时库知道我们在进入一个函数。由于“next”不停止内部函数调用,运行时库注意这些调用并知道何时跳过这些行。
  • godebug.ExitFunc:让godebug运行时库知道我们在离开一个函数,main中省略。
  • godebug运行时库:当且仅当用户用命令或一个断点告知其时,使程序暂停并等待输入,暂停时,它会提示用户输入并响应任何命令。
  • godebug.Declare:记录变量名和值的映射。该映射通过输出命令使用。

使用godebug

Step 1.安装



Step 2.设置断点

在任何想要断点的地方添加这个标记:



由于断点是源代码的一部分,你可以将自己的逻辑置于他们周围。假设你正在运行一个表格驱动多情况测试,其中一个测试输入“weird string”的情况是失败的,那么你可以将下面这个断点放入测试当中:



godebug test将于标记处暂停程序,方便定位。

Step 3.运行程序

使用godebug运行命令:



或者对测试来说 ,运行测试命令:



默认情况下,godebug只会添加调试instrumentation到package main(为了godebug运行)或者测试下的package(为了godebug测试)。这意味着在默认情况下,你无法进入来自导入包的函数。当需要的时候,执行下面这个行命令:



最后

godebug仍然还是一款需要打磨的新工具,目前存在的已知限制包括:
  • 性能开销
  • 可能会导致读取冲突,如果你的程序读取自stdin
  • 无法附上一个正在运行的进程
  • 开始前必须要知道你索要调试的包

其在GitHub上的地址点此进入。

有疑问加站长微信联系(非本文作者)