如何识别goroutine?

时间:2014-10-13 16:34:09

标签: go goroutine

假设我有一堆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邮件列表上阅读了相关的为什么 - 你想要做的帖子,所以我正在寻找替代品/黑客/解决方法(希望不涉及到代码每隔一行拨一次日志。)

1 个答案:

答案 0 :(得分:4)

workaround是可能的,并且涉及一小段C代码。

goid.c

#include <runtime.h>
void ·GetGoID(int32 ret) {
    ret = g->goid;
    USED(&ret);
}

main.go

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