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上的地址点此进入。
有疑问加站长微信联系(非本文作者)