func findVariable(d *dwarf.Data, name string) (*variable, error) { dr := d.Reader() for { e, err := dr.Next() if e == nil || err != nil { return nil, err } if e.Tag != dwarf.TagVariable { continue } aname, ok := e.Val(dwarf.AttrName).(string) if !ok || aname != name { continue } loc, ok := e.Val(dwarf.AttrLocation).([]uint8) if !ok { continue } if loc[0] != 3 { return nil, fmt.Errorf("can't determine variable addr") } addr := uint64(0) switch len(loc) { case 5: addr = uint64(binary.LittleEndian.Uint32(loc[1:])) case 9: addr = uint64(binary.LittleEndian.Uint64(loc[1:])) default: return nil, fmt.Errorf("unknown addr size") } off, ok := e.Val(dwarf.AttrType).(dwarf.Offset) if !ok { continue } typ, err := d.Type(off) if err != nil { return nil, err } return &variable{Addr: addr, Type: typ}, nil } return nil, nil }