[英]How to identify a goroutine?
假設我有一堆 goroutines 的堆棧跟蹤,例如:
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
在我的例子中,一個獨特的特定於應用程序的 object 由一組 goroutines 提供服務,我想查看與特定 object 相關的 goroutines 的堆棧跟蹤。我有數百個特定於應用程序的對象,所以我得到了數百個相同的 goroutines。
我 go 如何將我的日志與堆棧跟蹤中的 goroutine 相關聯? 似乎沒有辦法在堆棧跟蹤中識別當前 goroutine,也沒有辦法命名 goroutine,因此我可以在堆棧跟蹤中看到特定值。
聚苯乙烯
我已經閱讀了 Go 郵件列表上的相關帖子,所以我正在尋找替代方案/黑客/解決方法(希望不涉及在代碼中添加日志調用每隔一行)。
解決方法是可行的,並涉及一小段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
這個方法比@Alex B 簡單。它使用 debug.Stack() 以字節片的形式返回堆棧跟蹤,其中包含 goroutine 在第二個字邊界中的 id 以及堆棧跟蹤。 並解析它。
package main
import (
"bytes"
"fmt"
"runtime/debug"
"sync"
)
func main() {
w := sync.WaitGroup{}
w.Add(1)
go func() {
gr := bytes.Field(debug.Stack())[1]
fmt.Println(string(gr))
w.Done()
}()
w.Wait()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.