假设我有一堆goroutines的堆栈跟踪,e。 G:
goroutine 5633 [select]:
net/http.(*persistConn).writeLoop(0xc21303ac00)
/usr/lib/go/src/pkg/net/http/transport.go:791 +0x271
created by net/http.(*Transport).dialConn
/usr/lib/go/src/pkg/net/http/transport.go:529 +0x61e
在我的例子中,一组独特的特定于应用程序的对象由一组goroutine提供,我想查看与特定对象相关的goroutines的栈跟踪。我有数百个特定于应用程序的对象,因此我得到了数百个相同的goroutines。
我如何将我的日志与堆栈跟踪中的goroutine相关联?似乎没有一种方法可以识别堆栈跟踪中的当前goroutine,也无法命名goroutine,因此我可以在堆栈跟踪中看到特定的值。
PS
我已经在Go邮件列表上阅读了相关的为什么 - 你想要做的帖子,所以我正在寻找替代品/黑客/解决方法(希望不涉及到代码每隔一行拨一次日志。)
答案 0 :(得分:4)
workaround是可能的,并且涉及一小段C代码。
#include <runtime.h>
void ·GetGoID(int32 ret) {
ret = g->goid;
USED(&ret);
}
package main
import (
"fmt"
"sync"
)
// Declaration is required
func GetGoID() int32
func main() {
var wg sync.WaitGroup
f := func() {
wg.Add(1)
go func() {
fmt.Printf("goroutine %d\n", GetGoID())
wg.Done()
}()
}
for i := 0; i < 10; i++ {
f()
}
wg.Wait()
}
$ go build
$ ./example
goroutine 20
goroutine 21
goroutine 22
goroutine 23
goroutine 24
goroutine 25
goroutine 26
goroutine 27
goroutine 28
goroutine 29