go-delve/delve · error

entry has no location attribute

Error message

entry has no location attribute

What it means

InstructionsForEntry in pkg/dwarf/reader/reader.go converts a DWARF DIE into DWARF location-expression bytecode. For a non-member entry it reads the entry's dwarf.AttrLocation attribute; if the entry does not carry that attribute (the type assertion to []byte fails), Delve cannot produce location instructions and returns this error.

Source

Thrown at pkg/dwarf/reader/reader.go:208

		return nil, errors.New("invalid typecast for Dwarf instructions")
	}
	return instr, nil
}

func (reader *Reader) InstructionsForEntry(entry *dwarf.Entry) ([]byte, error) {
	if entry.Tag == dwarf.TagMember {
		instructions, ok := entry.Val(dwarf.AttrDataMemberLoc).([]byte)
		if !ok {
			return nil, errors.New("member data has no data member location attribute")
		}
		// clone slice to prevent stomping on the dwarf data
		return append([]byte{}, instructions...), nil
	}

	// non-member
	instructions, ok := entry.Val(dwarf.AttrLocation).([]byte)
	if !ok {
		return nil, errors.New("entry has no location attribute")
	}

	// clone slice to prevent stomping on the dwarf data
	return append([]byte{}, instructions...), nil
}

// NextMemberVariable moves the reader to the next debug entry that describes a member variable and returns the entry.
func (reader *Reader) NextMemberVariable() (*dwarf.Entry, error) {
	for {
		entry, err := reader.Next()
		if err != nil {
			return nil, err
		}
		if entry == nil {
			break
		}

		// All member variables will be at the same depth

View on GitHub (pinned to a23773e6c3)

Solutions

  1. Only call InstructionsForEntry on entries known to describe variables/locations with a location attribute
  2. Check entry.Val(dwarf.AttrLocation) yourself before calling and skip entries missing it
  3. Rebuild the binary without aggressive optimization or with debug info preserved so location attributes are emitted

Example fix

// before
instrs, err := InstructionsForEntry(entry)
// after
if entry.Val(dwarf.AttrLocation) == nil {
    return nil // skip entries without location info
}
instrs, err := InstructionsForEntry(entry)
Defensive patterns

Strategy: validation

Validate before calling

if entry.Val(dwarf.AttrLocation) == nil {
    return nil, fmt.Errorf("entry %v has no location attribute", entry.Tag)
}
instrs, err := InstructionsForEntry(entry)

Type guard

func hasLocationAttr(e *dwarf.Entry) bool {
    _, ok := e.Val(dwarf.AttrLocation).([]byte)
    return ok
}

Prevention

When it happens

Trigger: Calling InstructionsForEntry on a DWARF entry (e.g. a variable DIE) that has no dwarf.AttrLocation attribute, such as entries whose value is stored in registers via other attributes or entries of a kind that is not a location description.

Common situations: Evaluating variables from stripped or partially optimized binaries where the compiler omitted location attributes; walking DWARF entries generically (via Reader) and passing non-location DIEs (types, subprograms) to this function.

Related errors


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