Golang是否有类似shell set -x的功能 可打印执行的非标准库代码行
Golang 中实现类似shell
set -x 调试效果的方法 Go 本身没有内置和 shell set -x 完全对等的开箱即用功能,但通过现有工具完全可以实现你要的效果:运行时逐行打印实际执行的代码,同时过滤掉所有Go标准库的代码行,目前常用的可行方案有两种:
方案1:用Delve调试器实现(无代码侵入,优先推荐)
Delve是Go生态通用的原生调试器,不需要改任何业务代码,简单配置就能达到预期效果:
- 安装Delve:执行命令
go install github.com/go-delve/delve/cmd/dlv@latest - 配置过滤规则:启动调试时把
$GOROOT下所有标准库路径加入跳过列表,调试过程中不会进入runtime、fmt这类标准库的内部逻辑,只会停在你自己写的业务代码上 - 配置自动打印钩子:在dlv的交互界面设置步进触发的钩子,每次单步到新的代码行时自动打印当前文件名、行号和对应源码,后续程序运行时就会自动逐行输出执行流,不需要手动敲单步命令,效果和
set -x完全一致。
方案2:源码插桩(适合不挂调试器的运行场景)
如果你需要在正常运行程序、不附加调试器的场景下拿到逐行执行日志,可以通过AST插桩的方式做预处理:
- 插桩扫描时只指定你自己的业务代码目录,跳过GOROOT标准库路径、go mod缓存的第三方依赖路径
- 给每一行可执行的业务代码自动插入日志打印逻辑,输出当前执行位置的文件名、行号、源码内容
- 插桩完成后正常编译运行即可,输出的日志只会包含你自己写的业务代码执行记录,不会混杂任何标准库的代码行。
踩坑提示:Go运行时本身会高频调用标准库底层逻辑,如果不加路径过滤直接开全量trace,输出的日志量会大到完全无法阅读,上述两种方案都支持按路径前缀做过滤,配置一次就可以长期复用。
内容的提问来源于stack exchange,提问作者guettli
相关产品推荐
相关产品推荐

