众所周知,恐慌会产生一个堆栈跟踪到stdout(Playground链接):
panic: runtime error: index out of range
goroutine 1 [running]:
main.main()
/tmp/sandbox579134920/main.go:9 +0x20
Run Code Online (Sandbox Code Playgroud)
当你从恐慌中恢复时,似乎recover()只返回error描述导致恐慌的原因(游乐场链接).
runtime error: index out of range
Run Code Online (Sandbox Code Playgroud)
我的问题是,是否可以存储写入stdout的堆栈跟踪?这提供了比字符串更好的调试信息,runtime error: index out of range因为它显示文件中引起恐慌的确切行.
Go进程正在运行.我想要
我怎样才能做到这一点?
这应该很简单 - 请求功能:https://code.google.com/p/go/issues/detail?id = 2516,并根据该主题的结论,实施.那是两年多以前的事了.但是问题线程和提交都没有包含关于如何调用此功能的任何提示.
功能请求提到SIGQUIT调用JVM上的相应功能,但事实并非如此; 至少在go1.2上,SIGQUIT做#1和#2但也杀死了这个过程.
有人在前面问了一个相关的问题:如何转储goroutine stacktraces? 但他们没有明确要求#2或#3,没有一个答案符合#2,他们接受了不符合#2的答案.所以这是一个不同的问题.
我有一个用golang编写的进程作为守护进程运行.
几天后,它没有明显的原因停止产量.我认为这可能是一个内部僵局.如果我这样做,strace -p <PID>我可以看到这条线
futex(0x9aaba0, FUTEX_WAIT, 0, NULL
Run Code Online (Sandbox Code Playgroud)
显然这个电话永远不会结束.我想使用已经运行的进程(因为我不知道如何/何时再次触发错误)来调试问题.
我怎样才能看到正在运行的goroutine以及它们在哪里?如何从进程中转储任何其他信息可能对调试问题有用?
我一直在寻找周围,但到目前为止只进行了类似的文章写到这里通过Ariejan德弗鲁姆.
我想知道我是否可以将goroutine引入单元测试,以便它可以精确计算正在运行的goroutine的并发数量,并且可以告诉我它们是否正确地产生了我所说的数字goroutine.
我有以下代码例如..
import (
"testing"
"github.com/stretchr/testify/assert"
)
func createList(job int, done chan bool) {
time.Sleep(500)
// do something
time.Sleep(500)
done <- true
return
}
func TestNewList(t *testing.T) {
list := NewList()
if assert.NotNil(t, list) {
const numGoRoutines = 16
jobs := make(chan int, numGoRoutines)
done := make(chan bool, 1)
for j := 1; j <= numGoRoutines; j++ {
jobs <- j
go createList(j, done)
fmt.Println("sent job", j)
}
close(jobs)
fmt.Println("sent all jobs")
<-done
}
Run Code Online (Sandbox Code Playgroud) 当我这样做
done := make(chan bool)
for i := 0; i < 10; i++ {
go func() {
done <- true
}()
}
<-done
Run Code Online (Sandbox Code Playgroud)
而不是这个
done := make(chan bool)
for i := 0; i < 10; i++ {
go func() {
done <- true
}()
}
for i := 0; i < 10; i++ {
<-done
}
Run Code Online (Sandbox Code Playgroud)
如果我不关闭它们,我会泄漏goroutines吗?有什么工具可以检测我何时忘记关闭goroutines?
想象一个大型项目,它处理由其自己的 goroutine 处理的大量并发请求。碰巧代码中存在错误,其中一个请求将因零引用而导致恐慌。
在 Java、C# 和许多其他语言中,这最终会导致异常,该异常会停止请求,而不会对其他正常请求造成任何损害。在 Go 中,这会使整个程序崩溃。
AFAIK,我必须recover()为每一个新的 goroutine 创建。这是防止整个程序崩溃的唯一方法吗?
更新:recover()为每个 gorouting 创建添加调用似乎没问题。第三方库呢?如果第三方在没有recover()安全网的情况下创建 goroutine,似乎没有什么可做的。