Просмотр исходного кода

Feature #TASK_QT-31492 go1.24 runqget 调整

Carl 6 месяцев назад
Родитель
Сommit
1e9b7c8044

+ 2 - 0
ebpftracer/ebpf/include/socket_trace_common.h

@@ -171,6 +171,8 @@ enum offsets_index {
 	OFFSET_IDX_FIELDS_HTTP2_META_HEADERS_FRAME,
 	OFFSET_IDX_STREAM_HTTP2_CLIENT_CONN,
 	OFFSET_IDX_STREAM_ID_HTTP2_FRAME_HEADER,
+	OFFSET_IDX_P_GOIDCACHE,  // runtime.p.goidcache
+	OFFSET_IDX_P_RUNNEXT,    // runtime.p.runnext
 	OFFSET_IDX_MAX,
 };
 

+ 9 - 6
ebpftracer/ebpf/uprobe_base_bpf.c

@@ -573,12 +573,6 @@ int enter_runtime_runqget(struct pt_regs *ctx)
 	__u64 pid_tgid = bpf_get_current_pid_tgid();
 	__u32 tgid = pid_tgid >> 32;
 
-	int offset_g_goid = 152;
-
-	int offset_p_goidcache = 384;
-
-	int offset_p_runnext = 2456;
-
 	struct ebpf_proc_info *info =
 			bpf_map_lookup_elem(&proc_info_map, &tgid);
 	if (!info) {
@@ -588,6 +582,15 @@ int enter_runtime_runqget(struct pt_regs *ctx)
 	if(info->version < GO_VERSION(1, 15, 0)){
 		return 0;
 	}
+
+	// 从 proc_info 中获取偏移量,而不是硬编码
+	int offset_g_goid = info->offsets[OFFSET_IDX_GOID_RUNTIME_G];
+	int offset_p_goidcache = info->offsets[OFFSET_IDX_P_GOIDCACHE];
+	int offset_p_runnext = info->offsets[OFFSET_IDX_P_RUNNEXT];
+	// 检查偏移量是否有效
+	if (offset_g_goid < 0 || offset_p_goidcache < 0 || offset_p_runnext < 0) {
+		return 0;
+	}
 	void * sp = (void *)PT_REGS_SP(ctx);
 
 	void *p_ptr;// _p_ *p

+ 22 - 0
ebpftracer/tls.go

@@ -287,6 +287,26 @@ func (t *Tracer) AttachGoTlsUprobes(pid uint32, appInfo *AppInfo, codeType uint1
 		klog.Errorf("[AttachGoTlsUprobes] STEP 11.2: Failed to get goid offset, pid=%d, version=%s", pid, bi.GoVersion)
 	}
 
+	// 获取 runtime.p.goidcache 偏移量
+	klog.Infof("[AttachGoTlsUprobes] STEP 11.3: Getting offset for runtime.p.goidcache")
+	goidcacheOffset, okGoidcache := tracer.GetOffset(tracer.NewID("std", "runtime", "p", "goidcache"), path)
+	if okGoidcache {
+		klog.Infof("[AttachGoTlsUprobes] STEP 11.4: Successfully got goidcache offset=%d", goidcacheOffset)
+	} else {
+		klog.Warnf("[AttachGoTlsUprobes] STEP 11.5: Failed to get goidcache offset, pid=%d, version=%s, using fallback", pid, bi.GoVersion)
+		goidcacheOffset = 384 // fallback value
+	}
+
+	// 获取 runtime.p.runnext 偏移量
+	klog.Infof("[AttachGoTlsUprobes] STEP 11.6: Getting offset for runtime.p.runnext")
+	runnextOffset, okRunnext := tracer.GetOffset(tracer.NewID("std", "runtime", "p", "runnext"), path)
+	if okRunnext {
+		klog.Infof("[AttachGoTlsUprobes] STEP 11.7: Successfully got runnext offset=%d", runnextOffset)
+	} else {
+		klog.Warnf("[AttachGoTlsUprobes] STEP 11.8: Failed to get runnext offset, pid=%d, version=%s, using fallback", pid, bi.GoVersion)
+		runnextOffset = 2456 // fallback value
+	}
+
 	klog.Infof("[AttachGoTlsUprobes] STEP 12: Getting offset for runtime.hmap.buckets")
 	bucketsOff, ok2 := tracer.GetOffset(tracer.NewID("std", "runtime", "hmap", "buckets"), path)
 
@@ -414,6 +434,8 @@ func (t *Tracer) AttachGoTlsUprobes(pid uint32, appInfo *AppInfo, codeType uint1
 			info := EbpfProcInfo{}
 			info.Version = uint32(goVersion)
 			info.Offsets[OFFSET_IDX_GOID_RUNTIME_G] = uint16(offset)
+			info.Offsets[OFFSET_IDX_P_GOIDCACHE] = uint16(goidcacheOffset)
+			info.Offsets[OFFSET_IDX_P_RUNNEXT] = uint16(runnextOffset)
 			info.NetTCPConnItab = uint64(0)
 			info.CryptoTLSConnItab = uint64(0)
 			info.CredentialsSyscallConnItab = uint64(0)

+ 2 - 0
utils/modelse/bpf_struct.go

@@ -134,6 +134,8 @@ const (
 	OFFSET_IDX_FIELDS_HTTP2_META_HEADERS_FRAME
 	OFFSET_IDX_STREAM_HTTP2_CLIENT_CONN
 	OFFSET_IDX_STREAM_ID_HTTP2_FRAME_HEADER
+	OFFSET_IDX_P_GOIDCACHE // runtime.p.goidcache
+	OFFSET_IDX_P_RUNNEXT   // runtime.p.runnext
 	OFFSET_IDX_MAX
 )