jattach_linux_arm64.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package jattach
  2. ///*
  3. //#cgo CFLAGS: -I include
  4. //#cgo amd64 LDFLAGS: ${SRCDIR}/lib/libjattach_amd64.a
  5. //#cgo arm64 LDFLAGS: ${SRCDIR}/lib/libjattach_arm64.a
  6. //#include <stdlib.h>
  7. //// declaration jattach
  8. //int jattach(int pid, int argc, char** argv, int print_output);
  9. //*/
  10. //import "C"
  11. import (
  12. "fmt"
  13. "github.com/coroot/coroot-node-agent/utils"
  14. "github.com/coroot/coroot-node-agent/utils/enums"
  15. "os"
  16. "strings"
  17. )
  18. type JvmJattacher struct {
  19. Pid uint32
  20. Args []string
  21. PrintOutput int
  22. }
  23. func (j *JvmJattacher) JAttach() (int, error) {
  24. // cmd方式
  25. cwJattachCmdPath := utils.GetDefaultScriptsPath("cwjattach")
  26. // 执行升级
  27. args := []string{fmt.Sprintf("%d", j.Pid)}
  28. args = append(args, j.Args...)
  29. result, err := utils.AuthoritativeCMD(enums.RootUser, enums.DefaultTimeOut, os.Environ(), cwJattachCmdPath, args...)
  30. if err != nil {
  31. return -1, err
  32. }
  33. if strings.Contains(result, "JVM response code = 0") {
  34. return 0, nil
  35. } else {
  36. return -1, fmt.Errorf("JVM returned %s", result)
  37. }
  38. //
  39. //cArgs := make([]*C.char, len(j.Args))
  40. //for i, arg := range j.Args {
  41. // cArgs[i] = C.CString(arg)
  42. // defer C.free(unsafe.Pointer(cArgs[i])) // free mem
  43. //}
  44. //
  45. //// call C func jattach
  46. //// cArgs to **C.char
  47. //result := C.jattach(C.int(j.Pid), C.int(len(j.Args)), (**C.char)(unsafe.Pointer(&cArgs[0])), C.int(j.PrintOutput))
  48. //if int(result) != 0 {
  49. // return int(result), fmt.Errorf("[JAttach] jattacher failed")
  50. //}
  51. //return int(result), nil
  52. }