最近 Posts
xgo trace: 一个强大的Go堆栈可视化工具
概述 xgo提供了一系列工具,可以帮助Go开发者更快、更轻松地编写单元测试。
这些工具包括:
Trace Mock Trap 本文将介绍Trace工具。
如果你还不知道, xgo项目地址: https://github.com/xhd2015/xgo。
关于Trace工具 xgo中的Trace功能可用于可视化Go程序的执行过程。
在某些情况下,这可以替代调试器,减少查找错误所需的工作量。
问题背景 当我们开始接触一个新项目时,我们很难快速了解整个程序在底层做了什么。仅通过运行一些测试并观察结果是不够的。
xgo提供了Trace工具来解决这个问题。
为了展示Trace如何帮助我们快速理解代码,我将从几天前Reddit用户提出的一个随机项目开始,该项目可以在https://www.reddit.com/r/golang/s/RpEtEApIUj找到。
克隆仓库并运行一些测试 这里所选择的项目是pocketbase。
让我们按照下面的步骤开始:
克隆仓库 git clone https://github.com/pocketbase/pocketbase.git cd pocketbase 运行apis/backup_test.go的测试 go test -v -run TestBackupsList ./apis 输出:
=== RUN TestBackupsList === PAUSE TestBackupsList === CONT TestBackupsList === RUN TestBackupsList/unauthorized === RUN TestBackupsList/authorized_as_auth_record === RUN TestBackupsList/authorized_as_admin_(empty_list) === RUN TestBackupsList/authorized_as_admin --- PASS: TestBackupsList (0.83s) --- PASS: TestBackupsList/unauthorized (0.23s) --- PASS: TestBackupsList/authorized_as_auth_record (0.29s) --- PASS: TestBackupsList/authorized_as_admin_(empty_list) (0.
继续阅读
xgo: 在go中使用-toolexec实现猴子补丁
概述 在这篇博客中,我将详细介绍 xgo 的实现细节。
如果你不知道,xgo 项目位于 https://github.com/xhd2015/xgo。
它的作用很简单,就是在每个 Go 函数的开头添加拦截器,从而引入了所谓的 Trap 概念,然后在此基础上引入了其他功能,比如 Mock、Patch 和 Trace。
什么是 Trap? Trap 是插入到函数体开头的一段代码。以一个名为 greet 的函数为例:
func greet(s string) string { return "hello " + s } 经过xgo的处理后,编译器看到的代码将变为:
import "runtime" func greet(s string) (r0 string){ stop, post := runtime.__xgo_trap(greet, &s, &r0) if stop { return } defer post() return "hello " +s } 这两者的差异可以通过下面的图表来可视化:
如图所示,一旦函数被调用,它的控制流首先转移到 Trap,然后一系列拦截器将根据其目的检查当前调用是否应该被Mock、修改、记录或停止。
这个想法很简单,但也引发了一些问题:
编译器如何看到插桩后的代码? import runtime 是什么? 这两个问题反映了 xgo 的两个基本部分:编译器插桩和运行时插桩。
让我们先看看第一个问题。
继续阅读