godebug:一个跨平台的Go程序调试工具

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

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

https://img-my.csdn.net/uploads/201504/21/1429610480_9506.jpg

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

工作原理

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

https://img-my.csdn.net/uploads/201504/21/1429610537_5868.jpg

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

让我们看一下instrumentation步骤,以下是godebug插入的调用:

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

使用godebug

Step 1.安装

https://img-my.csdn.net/uploads/201504/21/1429610563_9295.jpg

Step 2.设置断点

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

https://img-my.csdn.net/uploads/201504/21/1429610575_6873.jpg

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

https://img-my.csdn.net/uploads/201504/21/1429610586_2955.jpg

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

Step 3.运行程序

使用godebug运行命令:

https://img-my.csdn.net/uploads/201504/21/1429610598_7189.jpg

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

https://img-my.csdn.net/uploads/201504/21/1429610614_8627.jpg

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

https://img-my.csdn.net/uploads/201504/21/1429610627_7226.jpg

最后

godebug仍然还是一款需要打磨的新工具,目前存在的已知限制包括:

  • 性能开销
  • 可能会导致读取冲突,如果你的程序读取自stdin
  • 无法附上一个正在运行的进程
  • 开始前必须要知道你索要调试的包

其在GitHub上的地址点此进入


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值