go-delve/delve · error

wrong real type for map

Error message

wrong real type for map

What it means

When loading a map variable, mapIterator resolves the map's real type through typedefs and expects the result to be a godwarf.MapType; after dereferencing the header pointer it expects a struct type. If the underlying type is not the expected struct (e.g. because the value is not actually a map or DWARF info is wrong), the map is marked Unreadable with this error.

Solutions

  1. Rebuild the target binary and restart the debug session so DWARF matches the code
  2. Check the variable is actually a map at that point (not uninitialized/zeroed memory)
  3. Verify variable v.Base/sv.Addr reads succeeded (unreadable memory upstream)
  4. Update delve; older versions mishandle newer Go runtime map types
Defensive patterns

Strategy: type-guard

Validate before calling

// before iterating, confirm the resolved type is a map
if _, ok := godwarf.ResolveTypedef(v.RealType).(*godwarf.MapType); !ok {
    return fmt.Errorf("variable %s is not a map", v.Name)
}

Type guard

func isMapType(v *proc.Variable) bool {
    _, ok := godwarf.ResolveTypedef(&(v.RealType.(*godwarf.MapType).TypedefType)).(*godwarf.MapType)
    return v.Unreadable == nil && ok
}

Try / catch

m, err := evalVariable(scope, expr)
if err != nil { return err }
if m.Unreadable != nil {
    if strings.Contains(m.Unreadable.Error(), "wrong real type for map") {
        return fmt.Errorf("%s is not a valid map in this process state", expr)
    }
    return m.Unreadable
}

Prevention

When it happens

Trigger: Evaluating a variable whose declared type resolves to a map but whose runtime/DWARF representation does not match (corrupted memory, bad debug info, evaluating a non-map value coerced to map type); calling loadValue/loadMap on a Variable with a wrongly-resolved RealType.

Common situations: Stale or mismatched binaries vs debug info (binary rebuilt without reattaching); reading corrupted memory from a crashed process; compiler/DWARF version quirks where the map header struct differs.

Related errors


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

Appendix: source

Thrown at pkg/proc/mapiter.go:27

	"github.com/go-delve/delve/pkg/goversion"
)

type mapIterator interface {
	next() bool
	key() *Variable
	value() *Variable
}

func (v *Variable) mapIterator(maxNumBuckets uint64) mapIterator {
	mt := v.RealType.(*godwarf.MapType)
	sv := v.clone()
	sv.RealType = godwarf.ResolveTypedef(&(sv.RealType.(*godwarf.MapType).TypedefType))
	sv = sv.maybeDereference()
	v.Base = sv.Addr

	maptype, ok := sv.RealType.(*godwarf.StructType)
	if !ok {
		v.Unreadable = errors.New("wrong real type for map")
		return nil
	}

	isptr := func(typ godwarf.Type) bool {
		_, isptr := typ.(*godwarf.PtrType)
		return isptr
	}

	it := &mapIteratorClassic{v: v, bidx: 0, b: nil, idx: 0, maxNumBuckets: maxNumBuckets, keyTypeIsPtr: isptr(mt.KeyType), elemTypeIsPtr: isptr(mt.ElemType)}
	itswiss := &mapIteratorSwiss{v: v, maxNumGroups: maxNumBuckets, keyTypeIsPtr: isptr(mt.KeyType), elemTypeIsPtr: isptr(mt.ElemType)}

	if sv.Addr == 0 {
		it.numbuckets = 0
		return it
	}

	v.mem = cacheMemory(v.mem, v.Base, int(v.RealType.Size()))

View on GitHub (pinned to a23773e6c3)