go - 如何打印golang程序中执行的所有方法

标签 go profiling reverse-engineering

类似于问题:How to dump goroutine stacktraces?

我接手了一个 go 程序,但它相当复杂,我无法通过阅读代码来手动跟踪代码流,因为执行了一些方法,我不知道为什么。

有没有办法打印出在 main.go 运行后执行的所有方法?

我知道:https://golang.org/pkg/net/http/pprof/但我只能看到 goroutines 运行,而不是我无法回溯/逆向工程的具体方法。

最佳答案

当我不确定一个方法是如何被调用时,我发现最简单的方法是在它的开头进行 debug.PrintStack()。如果它滚动得太快,请让它 panic

我想如果你打印所有执行的方法,信号就会在噪音中消失。

另一个有用的方法是编写一个单元测试,它只调用您感兴趣的代码的一部分。运行它并观察会发生什么。放入一些打印语句。一旦你弄清楚发生了什么,向你的单元测试添加一些检查(使其成为真正的测试),你就已经改​​进了代码。

完成单元测试(或任何入口点)后,您还可以使用 delve 进入它。

Michael Feather 的“Working Effectively With Legacy Code”非常好,它给出了很多策略来攻击遗留代码,并将其重构为好的。

最后,我发现很难让 Go 真正令人困惑,所以如果我继承的复杂代码在 Go 中,我通常会非常高兴 :-)

关于go - 如何打印golang程序中执行的所有方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49437415/

相关文章:

go - 将结构转换为YAML文件golang,如何避免yaml输出中的空引号?

c# - 是否有针对 .Net 解决方案(如 VisualVM for Java)的监控和分析工具?

android - 在 Android 中保持 API key 和 URL 安全的最佳方法?

debugging - Windows 堆 block 头解析和大小计算

go - 调试需要专用终端的golang程序

go - 与一对多的无效关联

haskell - 查找哪些数据类型被垃圾收集最多的最简单方法?

linux - setitimer, SIGALRM & 多线程进程 (linux, c)

assembly - sub eax,0-它有作用吗?

go - 如何在protoregistry中加载.proto文件