✨ feat:Collect symbolic link files corresponding to binary files.
This commit is contained in:
@@ -19,6 +19,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"math"
|
"math"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -254,7 +255,7 @@ func compress(config types.Coredump_config) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getLibrariesFromMaps(mapsFile string) ([]string, error) {
|
func getBinaryFileFromMaps(mapsFile string) ([]string, error) {
|
||||||
file, err := os.Open(mapsFile)
|
file, err := os.Open(mapsFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -283,6 +284,65 @@ func getLibrariesFromMaps(mapsFile string) ([]string, error) {
|
|||||||
return libs, nil
|
return libs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getSymlinkFile(libs []string) []string {
|
||||||
|
Files := make(map[string]bool)
|
||||||
|
for i := 0; i < len(libs); i++ {
|
||||||
|
exePath := libs[i]
|
||||||
|
Files[exePath] = true
|
||||||
|
exeDir := filepath.Dir(exePath)
|
||||||
|
exePath = filepath.Base(exePath)
|
||||||
|
files, err := os.ReadDir(exeDir)
|
||||||
|
if err != nil {
|
||||||
|
journal.Print(journal.PriErr, "read dir %s err: %v\n", exeDir, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, file := range files {
|
||||||
|
if file.Type()&os.ModeSymlink != 0 {
|
||||||
|
linkPath := filepath.Join(exeDir, file.Name())
|
||||||
|
targetPath, err := os.Readlink(linkPath)
|
||||||
|
if err != nil {
|
||||||
|
journal.Print(journal.PriErr, "read %s err: %v\n", linkPath, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if targetPath == exePath {
|
||||||
|
if _, ok := Files[linkPath]; ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
libs = append(libs, linkPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return libs
|
||||||
|
}
|
||||||
|
|
||||||
|
func getLdconf(libs []string) []string {
|
||||||
|
libs = append(libs, "/etc/ld.so.conf")
|
||||||
|
ldConfDir := "/etc/ld.so.conf.d"
|
||||||
|
|
||||||
|
// 检查目录是否存在
|
||||||
|
_, err := os.Stat(ldConfDir)
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
journal.Print(journal.PriErr, "directory %s is not exist", ldConfDir)
|
||||||
|
return libs
|
||||||
|
}
|
||||||
|
|
||||||
|
// 读取目录下的所有文件
|
||||||
|
files, err := os.ReadDir(ldConfDir)
|
||||||
|
if err != nil {
|
||||||
|
journal.Print(journal.PriErr, "can not read directory %s: %v", ldConfDir, err)
|
||||||
|
return libs
|
||||||
|
}
|
||||||
|
for _, file := range files {
|
||||||
|
if !file.IsDir() {
|
||||||
|
filePath := filepath.Join(ldConfDir, file.Name())
|
||||||
|
libs = append(libs, filePath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return libs
|
||||||
|
}
|
||||||
|
|
||||||
func addFileToZip(zipWriter *zip.Writer, filename string, pid string, pipe_config types.Pipeconfig) error {
|
func addFileToZip(zipWriter *zip.Writer, filename string, pid string, pipe_config types.Pipeconfig) error {
|
||||||
libabspath := fmt.Sprintf("/proc/%s/root%s", pid, filename)
|
libabspath := fmt.Sprintf("/proc/%s/root%s", pid, filename)
|
||||||
fileToZip, err := os.Open(libabspath)
|
fileToZip, err := os.Open(libabspath)
|
||||||
@@ -323,17 +383,14 @@ func addFileToZip(zipWriter *zip.Writer, filename string, pid string, pipe_confi
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func writelibfile(pid string, pipe_config types.Pipeconfig) error {
|
func writeBinaryFile(pid string, pipe_config types.Pipeconfig, filePath string) error {
|
||||||
mapsFile := fmt.Sprintf("/proc/%s/maps", pid)
|
mapsFile := fmt.Sprintf("/proc/%s/maps", pid)
|
||||||
libs, err := getLibrariesFromMaps(mapsFile)
|
libs, err := getBinaryFileFromMaps(mapsFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// for _, lib := range libs {
|
libs = getSymlinkFile(libs)
|
||||||
// journal.Print(journal.PriDebug,lib)
|
libs = getLdconf(libs)
|
||||||
// }
|
|
||||||
// journal.Print(journal.PriDebug,"lib's num:", len(libs))
|
|
||||||
filePath := fmt.Sprintf("%s/Executable_file.gz", pipe_config.Storage)
|
|
||||||
zipFile, err := os.Create(filePath)
|
zipFile, err := os.Create(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -465,8 +522,8 @@ func start() {
|
|||||||
}
|
}
|
||||||
coredump_config.Storage = fmt.Sprintf("%s/%s_%s_%d.coredump.zip", pipe_config.Storage, coredump_config.Initial_ns_pid, coredump_config.Process_ns_pid, coredump_config.Timestamp)
|
coredump_config.Storage = fmt.Sprintf("%s/%s_%s_%d.coredump.zip", pipe_config.Storage, coredump_config.Initial_ns_pid, coredump_config.Process_ns_pid, coredump_config.Timestamp)
|
||||||
}
|
}
|
||||||
writelibfile(coredump_config.Initial_ns_pid, pipe_config)
|
coredump_config.Binary_file = fmt.Sprintf("%s/%s_%s_%d.Binary_file.zip", pipe_config.Storage, coredump_config.Initial_ns_pid, coredump_config.Process_ns_pid, coredump_config.Timestamp)
|
||||||
coredump_config.Executable_file = fmt.Sprintf("%s/Executable_file.gz", pipe_config.Storage)
|
writeBinaryFile(coredump_config.Initial_ns_pid, pipe_config, coredump_config.Binary_file)
|
||||||
//write coredump info
|
//write coredump info
|
||||||
err = writeCoreConfig(coredump_config)
|
err = writeCoreConfig(coredump_config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -238,10 +238,6 @@ func debugInpod(conf *rest.Config, clientset *kubernetes.Clientset, config types
|
|||||||
Name: "src-debuginfo-dir",
|
Name: "src-debuginfo-dir",
|
||||||
MountPath: "/usr/src/debug",
|
MountPath: "/usr/src/debug",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
Name: "mrzcpd",
|
|
||||||
MountPath: "/opt/tsg/mrzcpd",
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
volumes := []v1.Volume{
|
volumes := []v1.Volume{
|
||||||
{
|
{
|
||||||
@@ -268,22 +264,14 @@ func debugInpod(conf *rest.Config, clientset *kubernetes.Clientset, config types
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
Name: "mrzcpd",
|
|
||||||
VolumeSource: v1.VolumeSource{
|
|
||||||
HostPath: &v1.HostPathVolumeSource{
|
|
||||||
Path: "/opt/tsg/mrzcpd",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
var containerCommands []string
|
var containerCommands []string
|
||||||
var containerCommand string
|
var containerCommand string
|
||||||
if _, err := os.Stat(config.Executable_file); err != nil {
|
if _, err := os.Stat(config.Binary_file); err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
containerCommand = "tail -f"
|
containerCommand = "tail -f"
|
||||||
} else {
|
} else {
|
||||||
containerCommand = fmt.Sprintf("unzip -o /host%s ; tail -f", config.Executable_file)
|
containerCommand = fmt.Sprintf("mkdir -p /tmp/sysroot && cd /tmp/sysroot ; unzip -o /host%s ; ldconfig -r /tmp/sysroot ; tail -f ", config.Binary_file)
|
||||||
}
|
}
|
||||||
if prestartPath != "" {
|
if prestartPath != "" {
|
||||||
prestartVolumeMount := v1.VolumeMount{
|
prestartVolumeMount := v1.VolumeMount{
|
||||||
@@ -370,7 +358,7 @@ func debugInpod(conf *rest.Config, clientset *kubernetes.Clientset, config types
|
|||||||
// Create exec request
|
// Create exec request
|
||||||
var cmd []string
|
var cmd []string
|
||||||
if command == "gdb" {
|
if command == "gdb" {
|
||||||
cmd = []string{"gdb", config.Process_exe_path, "/host" + config.Storage, "-cd", filepath.Dir(config.Process_exe_path)}
|
cmd = []string{"gdb", config.Process_exe_path, "/host" + config.Storage, "-cd", filepath.Dir(config.Process_exe_path), "-iex", "set sysroot /tmp/sysroot", "-iex", "set solib-search-path /tmp/sysroot/usr/lib64:/tmp/sysroot/opt/tsg/mrzcpd/icelake-server/lib:/tmp/sysroot/opt/tsg/mrzcpd/corei7/lib:/tmp/sysroot/opt/tsg/mrzcpd/znver1/lib"}
|
||||||
} else {
|
} else {
|
||||||
cmd = []string{command}
|
cmd = []string{command}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ type Coredump_config struct {
|
|||||||
Signal int
|
Signal int
|
||||||
Hostname string
|
Hostname string
|
||||||
Storage string
|
Storage string
|
||||||
Executable_file string
|
Binary_file string
|
||||||
}
|
}
|
||||||
type Coredump_cli_table struct {
|
type Coredump_cli_table struct {
|
||||||
PID string
|
PID string
|
||||||
|
|||||||
Reference in New Issue
Block a user