假设我有一些这样的代码:
value, err := some3rdpartylib.DoSomething()
if err != nil {
panic(err)
}
万一err != nil
我会得到这样的东西:
panic: some error explanation here
goroutine 1 [running]:
main.main()
/tmp/blabla/main.go:6 +0x80
此堆栈跟踪完全合法,但有时这些错误消息可能无法阐明发生了什么,因此我想更深入地研究3rd party库的源代码,以调查究竟是什么导致该错误被返回。但是,当我的代码如此恐慌时,无法获得返回此错误的实际位置。
需要更多说明:当我来自抛出异常的JVM世界时,我可以完全跟踪抛出异常的确切代码行,从而可以轻松找到位置并找出问题所在。Go堆栈跟踪恰好在我的代码恐慌的地方结束,因此在我的情况下不太有用。
我在这里创建了一个游乐场,理想情况下,我希望能够将错误跟踪到实际返回错误的地方,而不是惊慌失措。(例如,到第17行return "", errors.New("some error explanation here")
)
这有可能吗?
很快:这是不可能的。由于错误是值,因此不会以任何特殊方式处理它们。因此,当函数(通常)返回时,堆栈不再可用(即,另一个函数调用可能会覆盖返回错误函数的堆栈使用的内存)。
go1.5引入了一个名为trace的工具,但目前尚无全面的教程,我发现其中任何一个都没有说要包含这种功能。
跟踪与该问题完全无关,不确定为什么要提及它。
我可以想象,类似trace的工具可以记录当前上下文中任何函数的输入和返回(函数参数或返回值以及返回时的行号)。
我希望它是这种方式,但希望至少可以使用一些东西来包装有问题的代码(类似于您提到的跟踪),以获得更详细的堆栈跟踪。
我试图为此使用跟踪没有太大的成功。因此,这就是为什么我最终编写了自己的小型调试实用程序的原因(请参阅我的答案)。