Skip to content

Commit 366e7a1

Browse files
committed
Replace DwarfReader with GoOffsetLocator to facilliate future, lower overhead (memory) Go uprobes
Signed-off-by: Dom Del Nano <ddelnano@gmail.com>
1 parent d2f067b commit 366e7a1

3 files changed

Lines changed: 86 additions & 74 deletions

File tree

src/stirling/source_connectors/socket_tracer/uprobe_manager.cc

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,10 @@ Status UProbeManager::UpdateOpenSSLSymAddrs(obj_tools::RawFptrManager* fptr_mana
174174
return Status::OK();
175175
}
176176

177-
Status UProbeManager::UpdateGoCommonSymAddrs(ElfReader* elf_reader, DwarfReader* dwarf_reader,
177+
Status UProbeManager::UpdateGoCommonSymAddrs(ElfReader* elf_reader, GoOffsetLocator* offset_locator,
178178
const std::vector<int32_t>& pids) {
179179
PX_ASSIGN_OR_RETURN(struct go_common_symaddrs_t symaddrs,
180-
GoCommonSymAddrs(elf_reader, dwarf_reader));
180+
GoCommonSymAddrs(elf_reader, offset_locator));
181181

182182
for (auto& pid : pids) {
183183
PX_RETURN_IF_ERROR(go_common_symaddrs_map_->SetValue(pid, symaddrs));
@@ -186,10 +186,10 @@ Status UProbeManager::UpdateGoCommonSymAddrs(ElfReader* elf_reader, DwarfReader*
186186
return Status::OK();
187187
}
188188

189-
Status UProbeManager::UpdateGoHTTP2SymAddrs(ElfReader* elf_reader, DwarfReader* dwarf_reader,
189+
Status UProbeManager::UpdateGoHTTP2SymAddrs(ElfReader* elf_reader, GoOffsetLocator* offset_locator,
190190
const std::vector<int32_t>& pids) {
191191
PX_ASSIGN_OR_RETURN(struct go_http2_symaddrs_t symaddrs,
192-
GoHTTP2SymAddrs(elf_reader, dwarf_reader));
192+
GoHTTP2SymAddrs(elf_reader, offset_locator));
193193

194194
for (auto& pid : pids) {
195195
PX_RETURN_IF_ERROR(go_http2_symaddrs_map_->SetValue(pid, symaddrs));
@@ -198,9 +198,9 @@ Status UProbeManager::UpdateGoHTTP2SymAddrs(ElfReader* elf_reader, DwarfReader*
198198
return Status::OK();
199199
}
200200

201-
Status UProbeManager::UpdateGoTLSSymAddrs(ElfReader* elf_reader, DwarfReader* dwarf_reader,
201+
Status UProbeManager::UpdateGoTLSSymAddrs(ElfReader* elf_reader, GoOffsetLocator* offset_locator,
202202
const std::vector<int32_t>& pids) {
203-
PX_ASSIGN_OR_RETURN(struct go_tls_symaddrs_t symaddrs, GoTLSSymAddrs(elf_reader, dwarf_reader));
203+
PX_ASSIGN_OR_RETURN(struct go_tls_symaddrs_t symaddrs, GoTLSSymAddrs(elf_reader, offset_locator));
204204

205205
for (auto& pid : pids) {
206206
PX_RETURN_IF_ERROR(go_tls_symaddrs_map_->SetValue(pid, symaddrs));
@@ -524,10 +524,10 @@ StatusOr<int> UProbeManager::AttachNodeJsOpenSSLUprobes(const uint32_t pid,
524524

525525
StatusOr<int> UProbeManager::AttachGoTLSUProbes(const std::string& binary,
526526
obj_tools::ElfReader* elf_reader,
527-
obj_tools::DwarfReader* dwarf_reader,
527+
GoOffsetLocator* offset_locator,
528528
const std::vector<int32_t>& pids) {
529529
// Step 1: Update BPF symbols_map on all new PIDs.
530-
Status s = UpdateGoTLSSymAddrs(elf_reader, dwarf_reader, pids);
530+
Status s = UpdateGoTLSSymAddrs(elf_reader, offset_locator, pids);
531531
if (!s.ok()) {
532532
// Doesn't appear to be a binary with the mandatory symbols.
533533
// Might not even be a golang binary.
@@ -546,10 +546,10 @@ StatusOr<int> UProbeManager::AttachGoTLSUProbes(const std::string& binary,
546546

547547
StatusOr<int> UProbeManager::AttachGoHTTP2UProbes(const std::string& binary,
548548
obj_tools::ElfReader* elf_reader,
549-
obj_tools::DwarfReader* dwarf_reader,
549+
GoOffsetLocator* offset_locator,
550550
const std::vector<int32_t>& pids) {
551551
// Step 1: Update BPF symaddrs for this binary.
552-
Status s = UpdateGoHTTP2SymAddrs(elf_reader, dwarf_reader, pids);
552+
Status s = UpdateGoHTTP2SymAddrs(elf_reader, offset_locator, pids);
553553
if (!s.ok()) {
554554
return 0;
555555
}
@@ -886,8 +886,21 @@ int UProbeManager::DeployGoUProbes(const absl::flat_hash_set<md::UPID>& pids) {
886886
binary, dwarf_reader_status.msg());
887887
continue;
888888
}
889+
890+
auto build_info_s = ReadGoBuildInfo(elf_reader.get());
891+
if (!build_info_s.ok()) {
892+
VLOG(1) << absl::Substitute(
893+
"Failed to read build info from binary $0. Cannot deploy uprobes. "
894+
"Message = $1",
895+
binary, build_info_s.status().msg());
896+
continue;
897+
}
898+
auto& [go_version, build_info] = build_info_s.ValueOrDie();
899+
889900
std::unique_ptr<DwarfReader> dwarf_reader = dwarf_reader_status.ConsumeValueOrDie();
890-
Status s = UpdateGoCommonSymAddrs(elf_reader.get(), dwarf_reader.get(), pid_vec);
901+
std::unique_ptr<GoOffsetLocator> offset_locator =
902+
std::make_unique<GoOffsetLocator>(dwarf_reader.get(), build_info, go_version);
903+
Status s = UpdateGoCommonSymAddrs(elf_reader.get(), offset_locator.get(), pid_vec);
891904
if (!s.ok()) {
892905
VLOG(1) << absl::Substitute(
893906
"Golang binary $0 does not have the mandatory symbols (e.g. TCPConn).", binary);
@@ -898,7 +911,7 @@ int UProbeManager::DeployGoUProbes(const absl::flat_hash_set<md::UPID>& pids) {
898911
if (!cfg_disable_go_tls_tracing_) {
899912
VLOG(1) << absl::Substitute("Attempting to attach Go TLS uprobes to binary $0", binary);
900913
StatusOr<int> attach_status =
901-
AttachGoTLSUProbes(binary, elf_reader.get(), dwarf_reader.get(), pid_vec);
914+
AttachGoTLSUProbes(binary, elf_reader.get(), offset_locator.get(), pid_vec);
902915
if (!attach_status.ok()) {
903916
monitor_.AppendSourceStatusRecord("socket_tracer", attach_status.status(),
904917
"AttachGoTLSUProbes");
@@ -912,7 +925,7 @@ int UProbeManager::DeployGoUProbes(const absl::flat_hash_set<md::UPID>& pids) {
912925
// Go HTTP2 Probes.
913926
if (!cfg_disable_go_tls_tracing_ && cfg_enable_http2_tracing_) {
914927
StatusOr<int> attach_status =
915-
AttachGoHTTP2UProbes(binary, elf_reader.get(), dwarf_reader.get(), pid_vec);
928+
AttachGoHTTP2UProbes(binary, elf_reader.get(), offset_locator.get(), pid_vec);
916929
if (!attach_status.ok()) {
917930
monitor_.AppendSourceStatusRecord("socket_tracer", attach_status.status(),
918931
"AttachGoHTTP2UProbes");

src/stirling/source_connectors/socket_tracer/uprobe_manager.h

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -493,15 +493,15 @@ class UProbeManager {
493493
*
494494
* @param binary The path to the binary on which to deploy Go HTTP2 probes.
495495
* @param elf_reader ELF reader for the binary.
496-
* @param dwarf_reader DWARF reader for the binary.
496+
* @param offset_locator DWARF reader for the binary.
497497
* @param pids The list of PIDs that are new instances of the binary. Used to populate symbol
498498
* addresses.
499499
* @return The number of uprobes deployed, or error. It is not considered an error if the binary
500500
* is not a Go binary or doesn't use a Go HTTP2 library; instead the return value will be
501501
* zero.
502502
*/
503503
StatusOr<int> AttachGoHTTP2UProbes(const std::string& binary, obj_tools::ElfReader* elf_reader,
504-
obj_tools::DwarfReader* dwarf_reader,
504+
GoOffsetLocator* offset_locator,
505505
const std::vector<int32_t>& pids);
506506

507507
/**
@@ -510,14 +510,14 @@ class UProbeManager {
510510
*
511511
* @param binary The path to the binary on which to deploy Go HTTP2 probes.
512512
* @param elf_reader ELF reader for the binary.
513-
* @param dwarf_reader DWARF reader for the binary.
513+
* @param offset_locator DWARF reader for the binary.
514514
* @param pids The list of PIDs that are new instances of the binary. Used to populate symbol
515515
* addresses.
516516
* @return The number of uprobes deployed, or error. It is not an error if the binary
517517
* is not a Go binary or doesn't use Go TLS; instead the return value will be zero.
518518
*/
519519
StatusOr<int> AttachGoTLSUProbes(const std::string& binary, obj_tools::ElfReader* elf_reader,
520-
obj_tools::DwarfReader* dwarf_reader,
520+
GoOffsetLocator* offset_locator,
521521
const std::vector<int32_t>& new_pids);
522522

523523
/**
@@ -579,13 +579,11 @@ class UProbeManager {
579579

580580
Status UpdateOpenSSLSymAddrs(px::stirling::obj_tools::RawFptrManager* fptrManager,
581581
std::filesystem::path container_lib, uint32_t pid);
582-
Status UpdateGoCommonSymAddrs(obj_tools::ElfReader* elf_reader,
583-
obj_tools::DwarfReader* dwarf_reader,
582+
Status UpdateGoCommonSymAddrs(obj_tools::ElfReader* elf_reader, GoOffsetLocator* offset_locator,
584583
const std::vector<int32_t>& pids);
585-
Status UpdateGoHTTP2SymAddrs(obj_tools::ElfReader* elf_reader,
586-
obj_tools::DwarfReader* dwarf_reader,
584+
Status UpdateGoHTTP2SymAddrs(obj_tools::ElfReader* elf_reader, GoOffsetLocator* offset_locator,
587585
const std::vector<int32_t>& pids);
588-
Status UpdateGoTLSSymAddrs(obj_tools::ElfReader* elf_reader, obj_tools::DwarfReader* dwarf_reader,
586+
Status UpdateGoTLSSymAddrs(obj_tools::ElfReader* elf_reader, GoOffsetLocator* offset_locator,
589587
const std::vector<int32_t>& pids);
590588
Status UpdateNodeTLSWrapSymAddrs(int32_t pid, const std::filesystem::path& node_exe,
591589
const SemVer& ver);

0 commit comments

Comments
 (0)