簡體   English   中英

如何識別一個goroutine?

[英]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代碼。

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

這個方法比@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM