Parcourir la source

Fixed #TASK_QT-9810 1、支持获取Java版本

rock il y a 1 an
Parent
commit
971aae7c85
2 fichiers modifiés avec 75 ajouts et 0 suppressions
  1. 73 0
      ebpftracer/getjdkversion.go
  2. 2 0
      ebpftracer/jvm.go

+ 73 - 0
ebpftracer/getjdkversion.go

@@ -0,0 +1,73 @@
+package ebpftracer
+
+import (
+	"fmt"
+	"os"
+	"os/exec"
+	"bytes"
+	"strings"
+)
+
+func parseQuotedString(input string) (string, error) {
+	// 找到第一个双引号的位置
+	start := strings.Index(input, "\"")
+	if start == -1 {
+		return "", fmt.Errorf("no start quote found")
+	}
+
+	// 找到第二个双引号的位置
+	end := strings.Index(input[start+1:], "\"")
+	if end == -1 {
+		return "", fmt.Errorf("no end quote found")
+	}
+
+	// 提取开始和结束引号之间的内容
+	content := input[start+1 : start+1+end]
+	return content, nil
+}
+
+// getExecutablePath 根据进程ID获取可执行文件的真实路径。
+func getExecutablePath(pid uint32) (string, error) {
+	// 构造文件路径
+	link := fmt.Sprintf("/proc/%d/exe", pid)
+
+	// 使用os.Readlink获取符号链接指向的路径
+	execPath, err := os.Readlink(link)
+	if err != nil {
+		return "", err
+	}
+	return execPath, nil
+}
+
+func UsePIDToGetJDKVersion(pid uint32) string{
+	execPath, err := getExecutablePath(pid)
+	if err != nil {
+		fmt.Println("Error:", err)
+		return ""
+	}
+	// 构建Command对象
+	cmd := exec.Command(execPath, "-version")
+
+	// 创建缓冲区保存输出
+	var out bytes.Buffer
+	var stderr bytes.Buffer
+	cmd.Stdout = &out
+	cmd.Stderr = &stderr // java -version 实际是写入Stderr
+
+	// 运行命令
+	err = cmd.Run()
+	if err != nil {
+		fmt.Println("Command execution error:", err)
+		fmt.Println("Error output:", stderr.String())
+		return ""
+	}
+
+	// 打印输出信息
+	version, err := parseQuotedString(stderr.String())
+	if err != nil {
+		fmt.Println("Error:", err)
+		return ""
+	}
+	return version
+	
+}

+ 2 - 0
ebpftracer/jvm.go

@@ -25,6 +25,8 @@ func (t *Tracer) AttachJavaNioReadUprobes(pid uint32, insID utils.ID) []link.Lin
 	if t.disableL7Tracing {
 		return nil
 	}
+	version := UsePIDToGetJDKVersion(pid)
+	fmt.Println("java version is ", version)
 	var links []link.Link
 	bpath := getSoPath(pid, "nio.so")
 	if bpath == ""{