@@ -40,19 +40,22 @@ class UprobeSymaddrsTest : public ::testing::Test {
4040 void SetUp () {
4141 std::filesystem::path p = px::testing::BazelRunfilePath (kGoGRPCServer );
4242 ASSERT_OK_AND_ASSIGN (dwarf_reader_, DwarfReader::CreateIndexingAll (p));
43+ offset_locator_ = std::make_unique<GoOffsetLocator>(
44+ GoOffsetLocator (dwarf_reader_.get (), {}, {}, {}, " 1.19.0" ));
4345 ASSERT_OK_AND_ASSIGN (elf_reader_, ElfReader::Create (p));
4446 }
4547
4648 static inline constexpr std::string_view kGoGRPCServer =
4749 " src/stirling/testing/demo_apps/go_grpc_tls_pl/server/golang_1_19_grpc_tls_server_binary" ;
4850
4951 std::unique_ptr<DwarfReader> dwarf_reader_;
52+ std::unique_ptr<GoOffsetLocator> offset_locator_;
5053 std::unique_ptr<ElfReader> elf_reader_;
5154};
5255
5356TEST_F (UprobeSymaddrsTest, GoCommonSymAddrs) {
5457 ASSERT_OK_AND_ASSIGN (struct go_common_symaddrs_t symaddrs,
55- GoCommonSymAddrs (elf_reader_.get(), dwarf_reader_ .get()));
58+ GoCommonSymAddrs (elf_reader_.get(), offset_locator_ .get()));
5659
5760 // Check a few interface types.
5861 EXPECT_NE (symaddrs.tls_Conn, -1 );
@@ -68,7 +71,7 @@ TEST_F(UprobeSymaddrsTest, GoCommonSymAddrs) {
6871
6972TEST_F (UprobeSymaddrsTest, GoHTTP2SymAddrs) {
7073 ASSERT_OK_AND_ASSIGN (struct go_http2_symaddrs_t symaddrs,
71- GoHTTP2SymAddrs (elf_reader_.get(), dwarf_reader_ .get()));
74+ GoHTTP2SymAddrs (elf_reader_.get(), offset_locator_ .get()));
7275
7376 // Check a few interface types.
7477 EXPECT_NE (symaddrs.transport_bufWriter, -1 );
@@ -85,7 +88,7 @@ TEST_F(UprobeSymaddrsTest, GoHTTP2SymAddrs) {
8588
8689TEST_F (UprobeSymaddrsTest, GoTLSSymAddrs) {
8790 ASSERT_OK_AND_ASSIGN (struct go_tls_symaddrs_t symaddrs,
88- GoTLSSymAddrs (elf_reader_.get(), dwarf_reader_ .get()));
91+ GoTLSSymAddrs (elf_reader_.get(), offset_locator_ .get()));
8992
9093 // Check some member offsets.
9194 // The values may change when golang version is updated.
@@ -110,5 +113,90 @@ TEST(UprobeSymaddrsNodeTest, TLSWrapSymAddrsFromDwarfInfo) {
110113 EXPECT_EQ (symaddrs.uv__io_s_fd_offset , 0x04 );
111114}
112115
116+ TEST (GoOffsetLocator, GetStructMemberOffsetNoDWARFMissingStruct) {
117+ auto offset_locator = GoOffsetLocator (nullptr , {}, {}, {}, " " );
118+ auto status = offset_locator.GetStructMemberOffset (" runtime.g" , " goid" );
119+ EXPECT_FALSE (status.ok ());
120+ }
121+
122+ // NOLINTNEXTLINE: runtime/string
123+ std::string go_version = " 1.19.0" ;
124+ auto struct_map = StructOffsetMap{{" runtime.g" , {{" goid" , {{go_version, 152 }}}}}};
125+
126+ TEST (GoOffsetLocator, GetStructMemberOffsetNoDWARFMissingMember) {
127+ auto offset_locator = GoOffsetLocator (nullptr , struct_map, {}, {}, go_version);
128+ EXPECT_FALSE (offset_locator.GetStructMemberOffset (" runtime.g" , " missing_member" ).ok ());
129+ }
130+
131+ TEST (GoOffsetLocator, GetStructMemberOffsetNoDWARFMissingVersion) {
132+ auto offset_locator = GoOffsetLocator (nullptr , struct_map, {}, {}, " 1.18.0" );
133+ EXPECT_FALSE (offset_locator.GetStructMemberOffset (" runtime.g" , " goid" ).ok ());
134+ }
135+
136+ TEST (GoOffsetLocator, GetStructMemberOffsetNoDWARFSuccessfulLookup) {
137+ auto offset_locator = GoOffsetLocator (nullptr , struct_map, {}, {}, go_version);
138+
139+ ASSERT_OK_AND_ASSIGN (uint64_t offset, offset_locator.GetStructMemberOffset (" runtime.g" , " goid" ));
140+ EXPECT_EQ (offset, 152 );
141+ }
142+
143+ TEST (GoOffsetLocator, GetFunctionArgInfoNoDWARFMissingFunction) {
144+ auto offset_locator = GoOffsetLocator (nullptr , {}, {}, {}, " " );
145+ auto status = offset_locator.GetFunctionArgInfo (" missing_func" );
146+ EXPECT_FALSE (status.ok ());
147+ }
148+
149+ TEST (GoOffsetLocator, GetFunctionArgInfoNoDWARFMissingVersion) {
150+ FunctionArgMap fn_arg_map;
151+ auto var_location = obj_tools::VarLocation{obj_tools::LocationType::kRegister , 8 };
152+ fn_arg_map[" crypto/tls.(*Conn).Read" ][" b" ][go_version] =
153+ std::make_unique<obj_tools::VarLocation>(var_location);
154+
155+ auto offset_locator = GoOffsetLocator (nullptr , struct_map, fn_arg_map, {}, " 1.18.0" );
156+ auto status = offset_locator.GetFunctionArgInfo (" crypto/tls.(*Conn).Write" );
157+ EXPECT_FALSE (status.ok ());
158+ }
159+
160+ TEST (GoOffsetLocator, GetStructMemberOffsetNoDWARFUnknownLocation) {
161+ FunctionArgMap fn_arg_map;
162+ auto var_location = obj_tools::VarLocation{obj_tools::LocationType::kUnknown , -1 };
163+ fn_arg_map[" crypto/tls.(*Conn).Read" ][" b" ][go_version] =
164+ std::make_unique<obj_tools::VarLocation>(var_location);
165+
166+ auto offset_locator = GoOffsetLocator (nullptr , struct_map, fn_arg_map, {}, go_version);
167+
168+ auto status = offset_locator.GetFunctionArgInfo (" crypto/tls.(*Conn).Read" );
169+ ASSERT_OK_AND_ASSIGN (auto args, offset_locator.GetFunctionArgInfo (" crypto/tls.(*Conn).Read" ));
170+ EXPECT_NE (args.find (" b" ), args.end ());
171+ auto & arg_info = args[" b" ];
172+ EXPECT_EQ (arg_info.location .loc_type , obj_tools::LocationType::kUnknown );
173+ EXPECT_EQ (arg_info.location .offset , -1 );
174+ }
175+
176+ TEST (GoOffsetLocator, GetStructMemberOffsetNoDWARFNullLocation) {
177+ FunctionArgMap fn_arg_map;
178+ fn_arg_map[" crypto/tls.(*Conn).Read" ][" b" ][go_version] = nullptr ;
179+
180+ auto offset_locator = GoOffsetLocator (nullptr , struct_map, fn_arg_map, {}, go_version);
181+
182+ auto status = offset_locator.GetFunctionArgInfo (" crypto/tls.(*Conn).Read" );
183+ EXPECT_FALSE (status.ok ());
184+ }
185+
186+ TEST (GoOffsetLocator, GetFunctionArgInfoNoDWARFSuccessfulLookup) {
187+ FunctionArgMap fn_arg_map;
188+ auto var_location = obj_tools::VarLocation{obj_tools::LocationType::kRegister , 8 };
189+ fn_arg_map[" crypto/tls.(*Conn).Read" ][" b" ][go_version] =
190+ std::make_unique<obj_tools::VarLocation>(var_location);
191+
192+ auto offset_locator = GoOffsetLocator (nullptr , struct_map, fn_arg_map, {}, go_version);
193+
194+ ASSERT_OK_AND_ASSIGN (auto args, offset_locator.GetFunctionArgInfo (" crypto/tls.(*Conn).Read" ));
195+ EXPECT_NE (args.find (" b" ), args.end ());
196+ auto & arg_info = args[" b" ];
197+ EXPECT_EQ (arg_info.location .loc_type , obj_tools::LocationType::kRegister );
198+ EXPECT_EQ (arg_info.location .offset , 8 );
199+ }
200+
113201} // namespace stirling
114202} // namespace px
0 commit comments