func (s *Server) handleMapElement(req *proxyrpc.MapElementRequest, resp *proxyrpc.MapElementResponse) error { t, err := s.dwarfData.Type(dwarf.Offset(req.Map.TypeID)) if err != nil { return err } m, ok := t.(*dwarf.MapType) if !ok { return fmt.Errorf("variable is not a map") } var count uint64 // fn will be called for each element of the map. // When we reach the requested element, we fill in *resp and stop. // TODO: cache locations of elements. fn := func(keyAddr, valAddr uint64, keyType, valType dwarf.Type) bool { count++ if count == req.Index+1 { resp.Key = program.Var{TypeID: uint64(keyType.Common().Offset), Address: keyAddr} resp.Value = program.Var{TypeID: uint64(valType.Common().Offset), Address: valAddr} return false } return true } if err := s.peekMapValues(m, req.Map.Address, fn); err != nil { return err } if count <= req.Index { // There weren't enough elements. return fmt.Errorf("map has no element %d", req.Index) } return nil }
func (s *Server) handleValue(req *proxyrpc.ValueRequest, resp *proxyrpc.ValueResponse) error { t, err := s.dwarfData.Type(dwarf.Offset(req.Var.TypeID)) if err != nil { return err } resp.Value, err = s.value(t, req.Var.Address) return err }
{ "testdata/go-relocation-test-gcc441-x86.obj", []relocationTestEntry{ {0, &dwarf.Entry{Offset: 0xb, Tag: dwarf.TagCompileUnit, Children: true, Field: []dwarf.Field{{Attr: dwarf.AttrProducer, Val: "GNU C 4.4.1"}, {Attr: dwarf.AttrLanguage, Val: int64(1)}, {Attr: dwarf.AttrName, Val: "t.c"}, {Attr: dwarf.AttrCompDir, Val: "/tmp"}, {Attr: dwarf.AttrLowpc, Val: uint64(0x0)}, {Attr: dwarf.AttrHighpc, Val: uint64(0x5)}, {Attr: dwarf.AttrStmtList, Val: int64(0)}}}}, }, }, { "testdata/go-relocation-test-gcc424-x86-64.obj", []relocationTestEntry{ {0, &dwarf.Entry{Offset: 0xb, Tag: dwarf.TagCompileUnit, Children: true, Field: []dwarf.Field{{Attr: dwarf.AttrProducer, Val: "GNU C 4.2.4 (Ubuntu 4.2.4-1ubuntu4)"}, {Attr: dwarf.AttrLanguage, Val: int64(1)}, {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc424.c"}, {Attr: dwarf.AttrCompDir, Val: "/tmp"}, {Attr: dwarf.AttrLowpc, Val: uint64(0x0)}, {Attr: dwarf.AttrHighpc, Val: uint64(0x6)}, {Attr: dwarf.AttrStmtList, Val: int64(0)}}}}, }, }, { "testdata/gcc-amd64-openbsd-debug-with-rela.obj", []relocationTestEntry{ {203, &dwarf.Entry{Offset: 0xc62, Tag: dwarf.TagMember, Children: false, Field: []dwarf.Field{{Attr: dwarf.AttrName, Val: "it_interval"}, {Attr: dwarf.AttrDeclFile, Val: int64(7)}, {Attr: dwarf.AttrDeclLine, Val: int64(236)}, {Attr: dwarf.AttrType, Val: dwarf.Offset(0xb7f)}, {Attr: dwarf.AttrDataMemberLoc, Val: []byte{0x23, 0x0}}}}}, {204, &dwarf.Entry{Offset: 0xc70, Tag: dwarf.TagMember, Children: false, Field: []dwarf.Field{{Attr: dwarf.AttrName, Val: "it_value"}, {Attr: dwarf.AttrDeclFile, Val: int64(7)}, {Attr: dwarf.AttrDeclLine, Val: int64(237)}, {Attr: dwarf.AttrType, Val: dwarf.Offset(0xb7f)}, {Attr: dwarf.AttrDataMemberLoc, Val: []byte{0x23, 0x10}}}}}, }, }, } func TestDWARFRelocations(t *testing.T) { for i, test := range relocationTests { f, err := Open(test.file) if err != nil { t.Error(err) continue } dwarf, err := f.DWARF() if err != nil { t.Error(err)