golang/go · error

error processing serialized PGO profile: %w

Error message

error processing serialized PGO profile: %w

What it means

When pgo.IsSerialized detects the profile is in Go's serialized format, the compiler calls pgo.FromSerialized to deserialize it. This error wraps any deserialization failure, indicating the serialized data after the header is corrupt, truncated, or incompatible with the current compiler's expected format.

Source

Thrown at src/cmd/compile/internal/pgoir/irgraph.go:139

// New generates a profile-graph from the profile or pre-processed profile.
func New(profileFile string) (*Profile, error) {
	f, err := os.Open(profileFile)
	if err != nil {
		return nil, fmt.Errorf("error opening profile: %w", err)
	}
	defer f.Close()
	r := bufio.NewReader(f)

	isSerialized, err := pgo.IsSerialized(r)
	if err != nil {
		return nil, fmt.Errorf("error processing profile header: %w", err)
	}

	var base *pgo.Profile
	if isSerialized {
		base, err = pgo.FromSerialized(r)
		if err != nil {
			return nil, fmt.Errorf("error processing serialized PGO profile: %w", err)
		}
	} else {
		base, err = pgo.FromPProf(r)
		if err != nil {
			return nil, fmt.Errorf("error processing pprof PGO profile: %w", err)
		}
	}

	if base.TotalWeight == 0 {
		return nil, nil // accept but ignore profile with no samples.
	}

	// Create package-level call graph with weights from profile and IR.
	wg := createIRGraph(base.NamedEdgeMap)

	return &Profile{
		Profile:    base,
		WeightedCG: wg,

View on GitHub (pinned to b6b368adc5)

Solutions

  1. Regenerate the profile from a pprof CPU profile using the same Go toolchain version
  2. Avoid reusing serialized profiles across Go major version upgrades
  3. If using a profile cache, clear it after upgrading Go
  4. Fall back to providing a raw pprof format profile instead of a serialized one
Defensive patterns

Strategy: validation

Validate before calling

// Verify serialized profile compatibility by checking toolchain version
import (
    "os"
    "runtime"
    "strings"
)

func checkSerializedProfileCompat(path string) error {
    // Serialized profiles are version-specific — always regenerate with current toolchain
    goVersion := runtime.Version() // e.g. go1.21.0
    stat, err := os.Stat(path)
    if err != nil {
        return err
    }
    // If the profile is older than 30 days, recommend regeneration
    if time.Since(stat.ModTime()) > 30*24*time.Hour {
        return fmt.Errorf("profile may be stale (generated with older toolchain than %s), regenerate", goVersion)
    }
    return nil
}

Prevention

When it happens

Trigger: A file with the correct serialized-format magic header but containing corrupted or incomplete data after the header. A serialized profile generated by a different or incompatible Go compiler version.

Common situations: Using a pre-serialized PGO profile generated by a different Go version (the serialization format may have changed). Profile corruption after generation. Caching serialized profiles across Go version upgrades.

Related errors


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