golang/go · error

error opening profile: %w

Error message

error opening profile: %w

What it means

The `preprofile` tool (Go's PGO profile preprocessor) failed to open the input pprof file specified by the `-i` flag. This is a standard OS-level file open error wrapped with context. The preprofile tool reads a pprof-format profile and converts it to an intermediate representation for use by the compiler during Profile-Guided Optimization (PGO).

Source

Thrown at src/cmd/preprofile/main.go:39

	"log"
	"os"
)

func usage() {
	fmt.Fprintf(os.Stderr, "usage: go tool preprofile [-V] [-o output] -i input\n\n")
	flag.PrintDefaults()
	os.Exit(2)
}

var (
	output = flag.String("o", "", "output file path")
	input  = flag.String("i", "", "input pprof file path")
)

func preprocess(profileFile string, outputFile string) error {
	f, err := os.Open(profileFile)
	if err != nil {
		return fmt.Errorf("error opening profile: %w", err)
	}
	defer f.Close()

	r := bufio.NewReader(f)
	d, err := pgo.FromPProf(r)
	if err != nil {
		return fmt.Errorf("error parsing profile: %w", err)
	}

	var out *os.File
	if outputFile == "" {
		out = os.Stdout
	} else {
		out, err = os.Create(outputFile)
		if err != nil {
			return fmt.Errorf("error creating output file: %w", err)
		}
		defer out.Close()

View on GitHub (pinned to b6b368adc5)

Solutions

  1. Verify the profile file path is correct and the file exists: `ls -la <path>`.
  2. Check file permissions: ensure the user running the build has read access to the profile file.
  3. If using a relative path, ensure you're running the build from the correct directory, or switch to an absolute path.
  4. Regenerate the profile file if it was deleted or corrupted: collect a new CPU profile and pass it to `-pgo`.
  5. Check the `-pgo` path in your go.mod or build command for typos.

Example fix

# Before: wrong or missing profile path
go build -pgo=nonexistent.pb.gz ./...

# After: verify path exists and is accessible
ls -la default.pgo
go build -pgo=default.pgo ./...

# Or regenerate profile
go test -cpuprofile=cpu.prof ./...
go build -pgo=cpu.prof ./...
Defensive patterns

Strategy: validation

Validate before calling

// Validate profile file exists before passing to preprofile/-pgo
profilePath := "default.pgo"
if _, err := os.Stat(profilePath); err != nil {
    if os.IsNotExist(err) {
        log.Fatalf("PGO profile not found: %s — generate it first", profilePath)
    }
    log.Fatalf("Cannot access profile: %v", err)
}

Prevention

When it happens

Trigger: Fires at preprofile/main.go:38-39 when `os.Open(profileFile)` returns an error. The `profileFile` argument comes from the `-i` flag. This is typically invoked by the Go build system as `go tool preprofile -i input.pb.gz -o output` when PGO is enabled via `-pgo` flag in `go build`.

Common situations: The `-i` flag points to a file that doesn't exist or has a typo in the path. Insufficient file permissions to read the profile file. The profile path is relative and the working directory is wrong. The profile file was deleted or moved between generation and compilation. Using `-pgo` with an incorrect or stale profile path in go.mod or build configuration.

Related errors


AI-assisted analysis of golang/go@b6b368adc5 (2026-08-12). Data as JSON: /api/errors/e82e248418a40c82. Report an issue: GitHub.