summaryrefslogtreecommitdiff
path: root/coredump-handler
diff options
context:
space:
mode:
authorlinxin <[email protected]>2024-08-23 11:46:18 +0800
committerlinxin <[email protected]>2024-11-06 15:32:28 +0800
commit82e4f4b089277aaafbe7dc892264872284182371 (patch)
tree6ded48f5392020c285d579f166a620b411c74c68 /coredump-handler
parent8e7b45d08d17be0238976b4f825ed6130d21e05b (diff)
✨ feat:add solib-search-path /tmp/sysroot/usr/lib for debug
Diffstat (limited to 'coredump-handler')
-rw-r--r--coredump-handler/coredump-handler.go66
1 files changed, 34 insertions, 32 deletions
diff --git a/coredump-handler/coredump-handler.go b/coredump-handler/coredump-handler.go
index 3d09b0f..155d05c 100644
--- a/coredump-handler/coredump-handler.go
+++ b/coredump-handler/coredump-handler.go
@@ -32,6 +32,7 @@ import (
var coredump_config types.Coredump_config
var percent int64
+var sysrootPath string
func argsJudge() error {
@@ -262,13 +263,13 @@ func getBinaryFileFromMaps(mapsFile string) ([]string, error) {
}
defer file.Close()
- libSet := make(map[string]struct{})
+ binaryFileSet := make(map[string]struct{})
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
parts := strings.Fields(line)
if len(parts) > 5 && !strings.Contains(parts[5], "[") && strings.Contains(parts[1], "x") {
- libSet[parts[5]] = struct{}{}
+ binaryFileSet[parts[5]] = struct{}{}
}
}
@@ -276,22 +277,22 @@ func getBinaryFileFromMaps(mapsFile string) ([]string, error) {
return nil, err
}
- var libs []string
- for lib := range libSet {
- libs = append(libs, lib)
+ var binaryFiles []string
+ for binaryFile := range binaryFileSet {
+ binaryFiles = append(binaryFiles, binaryFile)
}
- return libs, nil
+ return binaryFiles, nil
}
-func getSymlinkFile(libs []string) []string {
+func getSymlinkFile(binaryFiles []string) []string {
Files := make(map[string]bool)
- for i := 0; i < len(libs); i++ {
- exePath := libs[i]
+ for i := 0; i < len(binaryFiles); i++ {
+ exePath := binaryFiles[i]
Files[exePath] = true
exeDir := filepath.Dir(exePath)
exePath = filepath.Base(exePath)
- files, err := os.ReadDir(exeDir)
+ files, err := os.ReadDir(sysrootPath + "/root" + exeDir)
if err != nil {
journal.Print(journal.PriErr, "read dir %s err: %v\n", exeDir, err)
continue
@@ -299,7 +300,7 @@ func getSymlinkFile(libs []string) []string {
for _, file := range files {
if file.Type()&os.ModeSymlink != 0 {
linkPath := filepath.Join(exeDir, file.Name())
- targetPath, err := os.Readlink(linkPath)
+ targetPath, err := os.Readlink(sysrootPath + "/root" + linkPath)
if err != nil {
journal.Print(journal.PriErr, "read %s err: %v\n", linkPath, err)
continue
@@ -309,43 +310,43 @@ func getSymlinkFile(libs []string) []string {
if _, ok := Files[linkPath]; ok {
continue
}
- libs = append(libs, linkPath)
+ binaryFiles = append(binaryFiles, linkPath)
}
}
}
}
- return libs
+ return binaryFiles
}
-func getLdconf(libs []string) []string {
- libs = append(libs, "/etc/ld.so.conf")
+func getLdconf(binaryFiles []string) []string {
+ binaryFiles = append(binaryFiles, "/etc/ld.so.conf")
ldConfDir := "/etc/ld.so.conf.d"
// 检查目录是否存在
- _, err := os.Stat(ldConfDir)
+ _, err := os.Stat(sysrootPath + "/root" + ldConfDir)
if os.IsNotExist(err) {
journal.Print(journal.PriErr, "directory %s is not exist", ldConfDir)
- return libs
+ return binaryFiles
}
// 读取目录下的所有文件
- files, err := os.ReadDir(ldConfDir)
+ files, err := os.ReadDir(sysrootPath + "/root" + ldConfDir)
if err != nil {
journal.Print(journal.PriErr, "can not read directory %s: %v", ldConfDir, err)
- return libs
+ return binaryFiles
}
for _, file := range files {
if !file.IsDir() {
filePath := filepath.Join(ldConfDir, file.Name())
- libs = append(libs, filePath)
+ binaryFiles = append(binaryFiles, filePath)
}
}
- return libs
+ return binaryFiles
}
-func addFileToZip(zipWriter *zip.Writer, filename string, pid string, pipe_config types.Pipeconfig) error {
- libabspath := fmt.Sprintf("/proc/%s/root%s", pid, filename)
- fileToZip, err := os.Open(libabspath)
+func addFileToZip(zipWriter *zip.Writer, filename string, pipe_config types.Pipeconfig) error {
+ binaryFileAbsPath := fmt.Sprintf("%s/root%s", sysrootPath, filename)
+ fileToZip, err := os.Open(binaryFileAbsPath)
if err != nil {
return err
}
@@ -383,14 +384,14 @@ func addFileToZip(zipWriter *zip.Writer, filename string, pid string, pipe_confi
return nil
}
-func writeBinaryFile(pid string, pipe_config types.Pipeconfig, filePath string) error {
- mapsFile := fmt.Sprintf("/proc/%s/maps", pid)
- libs, err := getBinaryFileFromMaps(mapsFile)
+func writeBinaryFile(pipe_config types.Pipeconfig, filePath string) error {
+ mapsFile := fmt.Sprintf("%s/maps", sysrootPath)
+ binaryFiles, err := getBinaryFileFromMaps(mapsFile)
if err != nil {
return err
}
- libs = getSymlinkFile(libs)
- libs = getLdconf(libs)
+ binaryFiles = getSymlinkFile(binaryFiles)
+ binaryFiles = getLdconf(binaryFiles)
zipFile, err := os.Create(filePath)
if err != nil {
return err
@@ -400,8 +401,8 @@ func writeBinaryFile(pid string, pipe_config types.Pipeconfig, filePath string)
zipWriter := zip.NewWriter(zipFile)
defer zipWriter.Close()
- for _, file := range libs {
- addFileToZip(zipWriter, file, pid, pipe_config)
+ for _, file := range binaryFiles {
+ addFileToZip(zipWriter, file, pipe_config)
}
journal.Print(journal.PriInfo, "Tar file created successfully")
@@ -429,6 +430,7 @@ func start() {
journal.Print(journal.PriInfo, info)
coredump_config.Process_exe_path = strings.Replace(coredump_config.Process_exe_path, "!", "/", -1)
//Judge agrs is correct or not.
+ sysrootPath = fmt.Sprintf("/proc/%s", coredump_config.Initial_ns_pid)
err = argsJudge()
if err != nil {
journal.Print(journal.PriErr, err.Error())
@@ -523,7 +525,7 @@ 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.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)
- writeBinaryFile(coredump_config.Initial_ns_pid, pipe_config, coredump_config.Binary_file)
+ writeBinaryFile(pipe_config, coredump_config.Binary_file)
//write coredump info
err = writeCoreConfig(coredump_config)
if err != nil {