考虑下面的程序,它简单地启动几个 goroutine,然后等待它们完成并通过 channel 发出信号表示它们已完成。

package main

import (
    "os"
    "runtime/trace"
    "time"
)

func doWork(c chan int) {
    startTime := time.Now()
    i := 0
    for curTime := startTime; curTime.Sub(startTime) < 2; curTime = time.Now() {
        i++
    }
    c <- i
}

func main() {
    numGoRoutine := 10
    traceOutFile, _ := os.OpenFile("/tmp/Trace.out", os.O_WRONLY|os.O_CREATE, os.ModeExclusive|os.ModePerm)
    trace.Start(traceOutFile)

    // Start goroutines
    termChannel := make(chan int)
    for i := 0; i < numGoRoutine; i++ {
        go doWork(termChannel)
    }

    // Wait for completion
    for i := 0; i < numGoRoutine; i++ {
        <-termChannel
    }

    trace.Stop()
}

当这个程序终止时,输出是一个名为 /tmp/Trace.out 的二进制文件。接下来,我尝试使用跟踪工具查看跟踪,如下所示。
go tool trace -http=localhost:8080  ./Main /tmp/Trace.out

这会产生一个带有指向 View Trace 的链接的页面(以及一个只提供聚合数据的其他链接的 View ),但点击该链接会导致一个空白页面。当我查看该页面的源代码时,我看到了以下源代码,这似乎暗示 JSON 是预期的,而不是二进制的。
<html>
    <head>
        <link href="/trace_viewer_html" rel="import">
        <script>
            document.addEventListener("DOMContentLoaded", function(event) {
                var viewer = new tr.TraceViewer('/jsontrace');
                document.body.appendChild(viewer);
            });
        </script>
    </head>
    <body>
    </body>
</html>

如何使用 Go 工具查看逐事件跟踪?

最佳答案

我可以确认@widsvc 的评论:您可能使用的是不兼容的浏览器,例如 Firefox。

它在 Chrome 中按预期工作。

在引擎盖下看,您可以在 Firefox 的控制台中看到此错误:



快速搜索后,它似乎使用了嵌入在 Chrome 中的 trace-viewer : https://www.chromium.org/developers/how-tos/trace-event-profiling-tool

我尝试在 http://localhost:8080/jsontrace 的内容上使用他们的独立 trace2html 工具,但输出仍然给我 Firefox 的错误(第一个“document.registerElement 不是一个函数”,在修复之后,其他人继续出现)

关于go - 如何查看 `runtime/trace` 生成的跟踪的详细信息?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33510046/

10-17 00:32