summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlinxin <[email protected]>2023-05-22 18:52:59 +0800
committerlinxin <[email protected]>2023-05-22 18:52:59 +0800
commit92774597eb5849bb62fb88732939c5cf5a1738ae (patch)
treec479ae629309c1db26973f8edefc7ab139e7f78e
parentb60f3669d967a5c999fd415fb1a424e6a24338af (diff)
修改脚本制作.so动态库
-rw-r--r--ci/travis.sh4
-rw-r--r--coredump-handler/coredump-handler.go64
-rw-r--r--coredump-handler/coredump_handler_wrapper.h20
-rw-r--r--script/coredump.spec5
4 files changed, 55 insertions, 38 deletions
diff --git a/ci/travis.sh b/ci/travis.sh
index c0b61d1..1de775d 100644
--- a/ci/travis.sh
+++ b/ci/travis.sh
@@ -43,6 +43,10 @@ go env
pwd
ls
mkdir -p /builds/linxin/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
+cd /builds/linxin/coredump-tools/breakpad/src/tools/linux/coredump_handler_wrapper
+make
+mkdir /opt/tsg/coredump/bin
+cp coredump_handler_wrapper.so /opt/tsg/coredump/bin
mv /builds/linxin/coredump-tools /builds/linxin/coredump-tools-${VERSION_ID}
tar --warning=no-file-changed -czvf /builds/linxin/rpmbuild/SOURCES/coredump-tools-${VERSION_ID}-${COMMIT_ID}.tar.gz ../coredump-tools-${VERSION_ID}
cp /builds/linxin/coredump-tools-${VERSION_ID}/script/coredump.spec /builds/linxin/rpmbuild/SPECS
diff --git a/coredump-handler/coredump-handler.go b/coredump-handler/coredump-handler.go
index c30a7d8..554980d 100644
--- a/coredump-handler/coredump-handler.go
+++ b/coredump-handler/coredump-handler.go
@@ -1,5 +1,11 @@
package main
+//#cgo CXXFLAGS: -std=c++11
+// #cgo CFLAGS: -I .
+// #cgo LDFLAGS: /opt/tsg/coredump/bin/coredump_handler_wrapper.so
+//#include "coredump_handler_wrapper.h"
+import "C"
+
import (
"archive/zip"
"context"
@@ -12,7 +18,6 @@ import (
"io"
"math"
"os"
- "os/exec"
"regexp"
"strconv"
"strings"
@@ -163,54 +168,43 @@ func writeCoreDumpToFile(config types.Coredump_config) error {
}
defer file.Close()
buf := make([]byte, 1024*1024)
- data := make([]byte, 1024*1024)
- // create a pipe to write file
- reader, writer := io.Pipe()
- go func() {
- defer writer.Close()
- // io.Copy(writer, os.Stdin)
- for {
- // 从标准输入中读取数据块
- n, err := os.Stdin.Read(buf)
- if err != nil {
- journal.Print(journal.PriErr, err.Error())
- writer.Close()
- return
- }
- // 将读取的数据块写入到管道中
- _, err = writer.Write(buf[:n])
- if err != nil {
- journal.Print(journal.PriErr, err.Error())
- return
- }
- }
- }()
-
for {
- // 从管道中读取数据,直到管道被关闭
- _, err = io.CopyBuffer(file, reader, data)
- if err != nil {
- if err != io.EOF {
- return err
- }
+ n, err := os.Stdin.Read(buf)
+ if err != nil && err != io.EOF {
+ return err
+ }
+ if n == 0 {
break
}
- _, err = file.Write(data)
+ _, err = file.Write(buf[:n])
if err != nil {
return err
}
}
return nil
}
+func HandleCrash(pid int, procfsDir string, mdFilename string) bool {
+ journal.Print(journal.PriInfo, "start convert to minidump")
+ return bool(C.HandleCrash(C.pid_t(pid), C.CString(procfsDir), C.CString(mdFilename)))
+}
func writeMiniDumpToFile(config types.Coredump_config) error {
filename := fmt.Sprintf("%s/%s_%s_%d.minidump", config.Storage, config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp)
- cmd := exec.Command("/opt/tsg/coredump/bin/core_handler", config.Initial_ns_pid, filename)
- cmd.Stdin = os.Stdin
- output, err := cmd.Output()
+ pid, err := strconv.Atoi(config.Initial_ns_pid)
if err != nil {
return err
}
- fmt.Println(string(output))
+ flag := HandleCrash(pid, "/proc/"+config.Initial_ns_pid, filename)
+ if !flag {
+ return errors.New("can not convert to minidump")
+ }
+ journal.Print(journal.PriInfo, "end convert to minidump")
+ // cmd := exec.Command("/opt/tsg/coredump/bin/core_handler", config.Initial_ns_pid, filename)
+ // cmd.Stdin = os.Stdin
+ // output, err := cmd.Output()
+ // if err != nil {
+ // return err
+ // }
+ // fmt.Println(string(output))
return nil
}
func compress(config types.Coredump_config) error {
diff --git a/coredump-handler/coredump_handler_wrapper.h b/coredump-handler/coredump_handler_wrapper.h
new file mode 100644
index 0000000..0983d58
--- /dev/null
+++ b/coredump-handler/coredump_handler_wrapper.h
@@ -0,0 +1,20 @@
+#ifndef CORE_HANDLER_H_
+#define CORE_HANDLER_H_
+
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <syslog.h>
+#include <unistd.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+_Bool HandleCrash(pid_t pid, const char* procfs_dir, const char* md_filename);
+#ifdef __cplusplus
+}
+#endif
+
+#endif // CORE_HANDLER_H_
diff --git a/script/coredump.spec b/script/coredump.spec
index c3d5837..39f9dfe 100644
--- a/script/coredump.spec
+++ b/script/coredump.spec
@@ -31,9 +31,8 @@ mkdir -p %{buildroot}/opt/tsg/coredump/etc
mkdir -p %{buildroot}/etc/profile.d
mkdir -p %{buildroot}/usr/lib/tmpfiles.d
mkdir -p %{buildroot}/usr/lib/sysctl.d
+cp /builds/linxin/coredump-tools/breakpad/src/tools/linux/coredump_handler_wrapper/coredump_handler_wrapper.so %{buildroot}/opt/tsg/coredump/bin
cp ./coredump-handler/coredump-handler %{buildroot}/opt/tsg/coredump/bin
-chmod +x ./coredump-handler/core_handler
-cp ./coredump-handler/core_handler %{buildroot}/opt/tsg/coredump/bin
cp ./config/config.json %{buildroot}/opt/tsg/coredump/etc
cp ./coredump-tool/coredump-tool %{buildroot}/opt/tsg/coredump/bin
cp ./script/coredump-tools.sh %{buildroot}/etc/profile.d
@@ -44,7 +43,7 @@ cp ./60-coredump.conf %{buildroot}/usr/lib/sysctl.d
/opt/tsg/coredump/etc/config.json
/opt/tsg/coredump/bin/coredump-handler
/opt/tsg/coredump/bin/coredump-tool
-/opt/tsg/coredump/bin/core_handler
+/opt/tsg/coredump/bin/coredump_handler_wrapper.so
/etc/profile.d/coredump-tools.sh
/usr/lib/tmpfiles.d/coredump.conf
/usr/lib/sysctl.d/60-coredump.conf