go-delve/delve · error

invalid interface type

Error message

invalid interface type

What it means

Thrown while loading an interface-typed variable (in the Go runtime itab/eface handling path) when the concrete type's data pointer is nil even though a type was expected, or in the module-data path when the type descriptor cannot be resolved. Delve refuses to fabricate a value, so the variable is marked unreadable with this message.

Source

Thrown at pkg/proc/variables.go:2120

	}
	return
}

func (v *Variable) loadInterface(recurseLevel int, loadData bool, cfg LoadConfig) {
	_type, data, isnil := v.readInterface()

	if isnil {
		// interface to nil
		data = data.maybeDereference()
		v.Children = []Variable{*data}
		if loadData {
			v.Children[0].loadValueInternal(recurseLevel, cfg)
		}
		return
	}

	if data == nil {
		v.Unreadable = errors.New("invalid interface type")
		return
	}

	mds, err := _type.bi.getModuleData(_type.mem)
	if err != nil {
		v.Unreadable = fmt.Errorf("error loading module data: %v", err)
		return
	}

	typ, directIface, err := RuntimeTypeToDIE(_type, data.Addr, mds)
	if err != nil {
		v.Unreadable = err
		return
	}

	deref := false
	if !directIface {
		realtyp := godwarf.ResolveTypedef(typ)

View on GitHub (pinned to a23773e6c3)

Solutions

  1. Print the variable with a lower recursion depth or use 'print <var>' after the interface is fully assigned
  2. Verify the binary being debugged matches the sources (rebuild to avoid stale metadata)
  3. Upgrade Delve to match the Go version of the target binary
  4. Inspect the concrete value via 'print <expr>.(type)' style narrowing in your code before debugging

Example fix

// before: evaluating an interface before initialization
var w io.Writer // nil data on some type words
// after: initialize before inspecting
var w io.Writer = os.Stdout
Defensive patterns

Strategy: type-guard

Validate before calling

// Check the interface is fully initialized before evaluating
if ifaceVar.DwarfType == nil || ifaceVar.Addr == 0 {
    return errors.New("interface not initialized; skip evaluation")
}

Type guard

func isConcreteInterface(v *proc.Variable) bool {
    return v.Kind == reflect.Interface && v.Children != nil && len(v.Children) > 0 && v.Children[0].Addr != 0
}

Try / catch

v, err := loadInterface(expr)
if err != nil && strings.Contains(err.Error(), "invalid interface type") {
    // inspect raw type word instead
tw, _ := readUintptr(ifaceVar.Addr)
    fmt.Printf("interface data nil; type word=%x\n", tw)
}

Prevention

When it happens

Trigger: Evaluating an interface variable whose type word resolved but whose data pointer read as nil; loading interface contents during interface type resolution (_type) when the underlying runtime type structure could not be found in memory.

Common situations: Inspecting partially initialized interfaces before assignment; corrupted or mismatched runtime type metadata (binary built with a Go version Delve doesn't fully support); reading freed/zeroed memory after the process state changed.

Related errors


AI-assisted analysis of go-delve/delve@a23773e6c3 (2026-08-31). Data as JSON: /api/errors/3be6b5b7ff561ca5. Report an issue: GitHub.