Я генерирую такой след:
func main() {
f, err := os.Create("trace.out")
if err != nil {
panic(err)
}
defer f.Close()
err = trace.Start(f)
if err != nil {
panic(err)
}
defer trace.Stop()
//this is my app:
http.HandleFunc("/", someFunc)
log.Fatal(http.ListenAndServe(":5000", nil))
}
Затем я запускаю CLI:
$ go run main.go
Обновите браузер, создается trace.out, 1,8 МБ, затем:
$ go tool trace trace.out
018/09/09 13:25:18 Parsing trace...
failed to parse trace: no EvFrequency event
Что мне здесь не хватает? Спасибо.
Данные трассировки можно просмотреть только после того, как вы остановили трассировку (то есть после вызова trace.Stop()
). В коде, который вы предоставили, http.ListenAndServer(...)
будет заблокирован навсегда (если не возникнет ошибка).
Вы пытаетесь просмотреть трассировку до того, как трассировка будет остановлена?
Одним из решений может быть ожидание сигнала прерывания, а затем выход из функции при его получении, что приведет к остановке и записи трассировки.
func main() {
f, err := os.Create("trace.out")
if err != nil {
panic(err)
}
defer f.Close()
err = trace.Start(f)
if err != nil {
panic(err)
}
defer trace.Stop()
http.HandleFunc("/", someFunc)
go func() {
log.Fatal(http.ListenAndServe(":5000", nil))
}()
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, os.Interrupt)
<-signalChan
}