|
|
@@ -3,21 +3,20 @@ package containers
|
|
|
import (
|
|
|
"debug/elf"
|
|
|
"fmt"
|
|
|
+ "github.com/coroot/coroot-node-agent/flags"
|
|
|
. "github.com/coroot/coroot-node-agent/utils/modelse"
|
|
|
klog "github.com/sirupsen/logrus"
|
|
|
- "io/ioutil"
|
|
|
"os"
|
|
|
"os/exec"
|
|
|
"regexp"
|
|
|
"runtime"
|
|
|
"strings"
|
|
|
-
|
|
|
)
|
|
|
|
|
|
var libjvmRegex = regexp.MustCompile(`.*/libjvm\.so`)
|
|
|
|
|
|
-func GetExeType(pid uint32) CodeType {
|
|
|
- mapsFilePath := fmt.Sprintf("/proc/%d/maps", pid)
|
|
|
+func GetExeType(pid uint32, rootfs string) CodeType {
|
|
|
+ mapsFilePath := fmt.Sprintf("%sproc/%d/maps", "/", pid)
|
|
|
|
|
|
data, err := os.ReadFile(mapsFilePath)
|
|
|
if err != nil {
|
|
|
@@ -29,18 +28,18 @@ func GetExeType(pid uint32) CodeType {
|
|
|
|
|
|
if libjvmRegex.MatchString(content) {
|
|
|
//fmt.Println("is java process")
|
|
|
- if isJavaAotProcess(pid) {
|
|
|
+ if isJavaAotProcess(pid, rootfs) {
|
|
|
//fmt.Println("is javaAot process")
|
|
|
return CodeTypeJavaAot
|
|
|
}
|
|
|
return CodeTypeJava
|
|
|
- } else if isJavaAotProcess(pid) {
|
|
|
+ } else if isJavaAotProcess(pid, rootfs) {
|
|
|
//fmt.Println("is javaAot process")
|
|
|
return CodeTypeJavaAot
|
|
|
- } else if isGoProcess(pid) {
|
|
|
+ } else if isGoProcess(pid, rootfs) {
|
|
|
//fmt.Println("is go process")
|
|
|
return CodeTypeGo
|
|
|
- } else if isNetCoreProcess(pid) {
|
|
|
+ } else if isNetCoreProcess(pid, rootfs) {
|
|
|
// fmt.Println("is netcore process")
|
|
|
return CodeTypeNetCoreAot
|
|
|
}
|
|
|
@@ -48,19 +47,32 @@ func GetExeType(pid uint32) CodeType {
|
|
|
}
|
|
|
|
|
|
// isJavaAotProcess checks if the process with the given PID is a GraalVM native image
|
|
|
-func isJavaAotProcess(pid uint32) bool {
|
|
|
+func isJavaAotProcess(pid uint32, rootfs string) bool {
|
|
|
// Get the executable path for the given PID
|
|
|
- exePath, err := os.Readlink(fmt.Sprintf("/proc/%d/exe", pid))
|
|
|
+ exePath, err := os.Readlink(fmt.Sprintf("%sproc/%d/exe", "/", pid))
|
|
|
if err != nil {
|
|
|
- fmt.Printf("Error reading executable path for PID %d: %v\n", pid, err)
|
|
|
+ //fmt.Printf("Error reading executable path for PID %d: %v\n", pid, err)
|
|
|
+ klog.WithError(err).Errorf("isJavaAotProcess,failed to reading executable path for PID [%d]", pid)
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
// Read the content of the executable file
|
|
|
- content, err := ioutil.ReadFile(exePath)
|
|
|
+ pathPrefix := rootfs
|
|
|
+ if pathPrefix == "" && *flags.RunInContainer {
|
|
|
+ pathPrefix = *flags.HostDirPathPrefix
|
|
|
+ }
|
|
|
+ content, err := os.ReadFile(fmt.Sprintf("%s%s", pathPrefix, exePath))
|
|
|
if err != nil {
|
|
|
- fmt.Printf("Error reading executable file for PID %d: %v\n", pid, err)
|
|
|
- return false
|
|
|
+ if _, err = os.Stat(exePath); err == nil {
|
|
|
+ content, err = os.ReadFile(exePath)
|
|
|
+ if err != nil {
|
|
|
+ klog.WithError(err).Errorf("isJavaAotProcess,failed to reading executable file local for PID [%d]", pid)
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ klog.WithError(err).Errorf("isJavaAotProcess,failed to reading executable file for PID [%d]", pid)
|
|
|
+ return false
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Check if the file contains the "graal_attach_thread" string
|
|
|
@@ -71,16 +83,30 @@ func isJavaAotProcess(pid uint32) bool {
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
-func isNetCoreProcess(pid uint32) bool {
|
|
|
+func isNetCoreProcess(pid uint32, rootfs string) bool {
|
|
|
path, err := getProcessPath(pid)
|
|
|
if err != nil {
|
|
|
- fmt.Printf("无法获取进程路径:%s\n", err)
|
|
|
+ //fmt.Printf("无法获取进程路径:%s\n", err)
|
|
|
+ klog.WithError(err).Errorf("isNetCoreProcess,failed to open as elf binary path for PID [%d]", pid)
|
|
|
return false
|
|
|
}
|
|
|
- ef, err := elf.Open(path)
|
|
|
+
|
|
|
+ pathPrefix := rootfs
|
|
|
+ if pathPrefix == "" && *flags.RunInContainer {
|
|
|
+ pathPrefix = *flags.HostDirPathPrefix
|
|
|
+ }
|
|
|
+ ef, err := elf.Open(pathPrefix + path)
|
|
|
if err != nil {
|
|
|
- fmt.Println("failed to open as elf binary", err)
|
|
|
- return false
|
|
|
+ if _, err = os.Stat(path); err == nil {
|
|
|
+ ef, err = elf.Open(path)
|
|
|
+ if err != nil {
|
|
|
+ klog.WithError(err).Errorf("isNetCoreProcess,failed to open as elf binary file local for PID [%d]", pid)
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ klog.WithError(err).Errorf("isNetCoreProcess,failed to open as elf binary file for PID [%d]", pid)
|
|
|
+ return false
|
|
|
+ }
|
|
|
}
|
|
|
defer ef.Close()
|
|
|
|
|
|
@@ -92,16 +118,30 @@ func isNetCoreProcess(pid uint32) bool {
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
-func isGoProcess(pid uint32) bool {
|
|
|
+func isGoProcess(pid uint32, rootfs string) bool {
|
|
|
path, err := getProcessPath(pid)
|
|
|
if err != nil {
|
|
|
- fmt.Printf("无法获取进程路径:%s\n", err)
|
|
|
+ klog.WithError(err).Errorf("isGoProcess,failed to open as elf binary path for PID [%d]", pid)
|
|
|
return false
|
|
|
}
|
|
|
- ef, err := elf.Open(path)
|
|
|
+
|
|
|
+ pathPrefix := rootfs
|
|
|
+ if pathPrefix == "" && *flags.RunInContainer {
|
|
|
+ pathPrefix = *flags.HostDirPathPrefix
|
|
|
+ }
|
|
|
+
|
|
|
+ ef, err := elf.Open(pathPrefix + path)
|
|
|
if err != nil {
|
|
|
- fmt.Println("failed to open as elf binary", err)
|
|
|
- return false
|
|
|
+ if _, err = os.Stat(path); err == nil {
|
|
|
+ ef, err = elf.Open(path)
|
|
|
+ if err != nil {
|
|
|
+ klog.WithError(err).Errorf("isGoProcess,failed to open as elf binary file local for PID [%d]", pid)
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ klog.WithError(err).Errorf("isGoProcess,failed to open as elf binary file for PID [%d]", pid)
|
|
|
+ return false
|
|
|
+ }
|
|
|
}
|
|
|
defer ef.Close()
|
|
|
|