【问题标题】:How to print all methods executed in a golang program如何打印在 golang 程序中执行的所有方法
【发布时间】:2018-09-01 09:47:04
【问题描述】:

类似问题:How to dump goroutine stacktraces?

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

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

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

【问题讨论】:

  • pprof 是一个完整的分析器。它将生成完整的配置文件,包括所有函数调用和每个函数的内存/CPU 使用情况。覆盖得很好on the Go blog
  • 您是否尝试过使用delve 单步执行程序?
  • pprof 是一个采样分析器,所以它只记录采样的位置。
  • 我会给@Adrian 另一个机会:localhost:6060/debug/pprof/goroutine?debug=2 如果你说执行的所有东西都必须在那里,也许我迷失在一堆带有 0x72、0x0、0x0、0x0 的文本中...有没有办法用一些 -h 标志显示它?调试器对我不起作用,因为它是区块链以太坊的疯狂,也运行一些 C 库左右。
  • @EnchanterIO:是的,pprof(和大多数分析器)不会跟踪每个函数调用的时间,它们会记录每个函数被采样的次数。您需要在一段时间内练习要分析的代码。

标签: go profiling reverse-engineering


【解决方案1】:

当我不确定如何调用方法时,我发现最简单的方法是在它的开头使用debug.PrintStack()。如果滚动速度过快,请将其设为panic

我认为如果您打印所有执行的方法,信号会在噪音中丢失。

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

一旦你有一个单元测试(或任何入口点),你也可以通过delve 进入它。

Michael Feather 的“有效地使用遗留代码”非常好,它提供了许多攻击遗留代码的策略,并将其重构为善良。

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

【讨论】:

  • 感谢 Gragam。我已经尝试了 debug.PrintStack 就像第一件事一样,但它没有打印任何东西,也许我做错了什么。会再试一次。是的,单元测试绝对是解决这个问题的最佳方法,我将模拟制造麻烦的库,然后调试其中的一部分。几年前我已经读过这本书了 :) 我现在必须做其他事情,但几天后会回到这个问题/答案/cmets 并解决它或根据进度更新它。
  • fmt.Println 是否打印任何内容?也许您的程序的标准输出将进入日志文件或 systemd 日志。或者可能没有调用您放置 debug.PrintStack 的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
相关资源
最近更新 更多