codekingpro/portable-devtools
114k
1// Copyright 2025 The Go Authors. All rights reserved.2// Use of this source code is governed by a BSD-style3// license that can be found in the LICENSE file.4 5package main6 7import (8 "bytes"9 "net/http"10 "os"11 "runtime/trace"12 "strings"13 "testing"14 "testing/synctest"15 "time"16 17 "internal/trace/testtrace"18)19 20// Regression test for go.dev/issue/74850.21func TestSyscallProfile74850(t *testing.T) {22 testtrace.MustHaveSyscallEvents(t)23 24 var buf bytes.Buffer25 err := trace.Start(&buf)26 if err != nil {27 t.Fatalf("start tracing: %v", err)28 }29 30 synctest.Test(t, func(t *testing.T) {31 go hidden1(t)32 go hidden2(t)33 go visible(t)34 synctest.Wait()35 time.Sleep(1 * time.Millisecond)36 synctest.Wait()37 })38 trace.Stop()39 40 if t.Failed() {41 return42 }43 44 parsed, err := parseTrace(&buf, int64(buf.Len()))45 if err != nil {46 t.Fatalf("parsing trace: %v", err)47 }48 49 records, err := pprofByGoroutine(computePprofSyscall(), parsed)(&http.Request{})50 if err != nil {51 t.Fatalf("failed to generate pprof: %v\n", err)52 }53 54 for _, r := range records {55 t.Logf("Record: n=%d, total=%v", r.Count, r.Time)56 for _, f := range r.Stack {57 t.Logf("\t%s", f.Func)58 t.Logf("\t\t%s:%d @ 0x%x", f.File, f.Line, f.PC)59 }60 }61 if len(records) == 0 {62 t.Error("empty profile")63 }64 65 // Make sure we see the right frames.66 wantSymbols := []string{"cmd/trace.visible", "cmd/trace.hidden1", "cmd/trace.hidden2"}67 haveSymbols := make([]bool, len(wantSymbols))68 for _, r := range records {69 for _, f := range r.Stack {70 for i, s := range wantSymbols {71 if strings.Contains(f.Func, s) {72 haveSymbols[i] = true73 }74 }75 }76 }77 for i, have := range haveSymbols {78 if !have {79 t.Errorf("expected %s in syscall profile", wantSymbols[i])80 }81 }82}83 84func stat(t *testing.T) {85 _, err := os.Stat(".")86 if err != nil {87 t.Errorf("os.Stat: %v", err)88 }89}90 91func hidden1(t *testing.T) {92 stat(t)93}94 95func hidden2(t *testing.T) {96 stat(t)97 stat(t)98}99 100func visible(t *testing.T) {101 stat(t)102 time.Sleep(1 * time.Millisecond)103}104 