1// Copyright 2023 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5//go:build ignore
6
7package main
8
9import (
10	"bytes"
11	"fmt"
12	"internal/trace/raw"
13	"internal/trace/version"
14	"io"
15	"log"
16	"os"
17	"os/exec"
18)
19
20func main() {
21	// Create command.
22	var trace, stderr bytes.Buffer
23	cmd := exec.Command("go", "run", "./testprog/main.go")
24	cmd.Stdout = &trace
25	cmd.Stderr = &stderr
26
27	// Run trace program; the trace will appear in stdout.
28	fmt.Fprintln(os.Stderr, "running trace program...")
29	if err := cmd.Run(); err != nil {
30		log.Fatalf("running trace program: %v:\n%s", err, stderr.String())
31	}
32
33	// Create file.
34	f, err := os.Create(fmt.Sprintf("./go1%d.test", version.Current))
35	if err != nil {
36		log.Fatalf("creating output file: %v", err)
37	}
38	defer f.Close()
39
40	// Write out the trace.
41	r, err := raw.NewReader(&trace)
42	if err != nil {
43		log.Fatalf("reading trace: %v", err)
44	}
45	w, err := raw.NewTextWriter(f, version.Current)
46	for {
47		ev, err := r.ReadEvent()
48		if err == io.EOF {
49			break
50		}
51		if err != nil {
52			log.Fatalf("reading trace: %v", err)
53		}
54		if err := w.WriteEvent(ev); err != nil {
55			log.Fatalf("writing trace: %v", err)
56		}
57	}
58}
59