首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别goroutine?

如何识别goroutine?
EN

Stack Overflow用户
提问于 2014-10-14 00:34:09
回答 2查看 3.8K关注 0票数 6

假设我有一堆goroutine的堆栈跟踪,例如:

代码语言:javascript
复制
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。

我该如何将我的日志与堆栈跟踪中的goroutines关联起来?似乎没有一种方法可以在堆栈跟踪中标识当前的goroutine,也没有办法命名goroutine,这样我就可以在堆栈跟踪中看到一个特定值。

PS

我已经在Go邮件列表上阅读了相关的“为什么你想做这件事”的帖子,所以我正在寻找替代方案/hacks/变通方法(希望不会涉及到每隔一行使用日志调用来散布代码)。

EN

回答 2

Stack Overflow用户

发布于 2014-10-14 02:00:05

一个workaround是可能的,并且包含一小段C代码。

goid.c

代码语言:javascript
复制
#include <runtime.h>
void ·GetGoID(int32 ret) {
    ret = g->goid;
    USED(&ret);
}

main.go

代码语言:javascript
复制
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()
}

构建并运行

代码语言:javascript
复制
$ go build
$ ./example
goroutine 20
goroutine 21
goroutine 22
goroutine 23
goroutine 24
goroutine 25
goroutine 26
goroutine 27
goroutine 28
goroutine 29
票数 5
EN

Stack Overflow用户

发布于 2022-01-15 16:33:25

Play

这个方法比@Alex B更简单。它使用了debug.Stack()以字节片的形式返回堆栈跟踪的事实,它在第二个字边界中包含goroutine它的id以及堆栈跟踪。并解析它。

代码语言:javascript
复制
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()
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26344750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档