stack.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package ebpftracer
  2. import (
  3. "github.com/cilium/ebpf"
  4. "github.com/cilium/ebpf/link"
  5. "github.com/coroot/coroot-node-agent/ebpftracer/tracer"
  6. "github.com/coroot/coroot-node-agent/utils"
  7. klog "github.com/sirupsen/logrus"
  8. )
  9. func (t *Tracer) AttachStackUprobes(path string, uprobes []tracer.Uprobe) []link.Link {
  10. var links []link.Link
  11. ex, err := link.OpenExecutable(path)
  12. if err != nil {
  13. return nil
  14. }
  15. klog.Infoln("[stack] Attach Start", path)
  16. for i, up := range uprobes {
  17. klog.Debugf("[stack] attaching %d -> %d -> %s -> 0x%x -> 0x%x -> 0x%x", i, len(uprobes), up.Funcname, up.AbsOffset, up.Address, up.AbsOffset+up.Address)
  18. var prog *ebpf.Program
  19. switch up.Location {
  20. case tracer.AtEntry:
  21. prog = t.uprobes["ent"]
  22. case tracer.AtRet:
  23. prog = t.uprobes["ret"]
  24. case tracer.AtDotNetEntry:
  25. prog = t.uprobes["dotnetent"]
  26. }
  27. uplink, err := ex.Uprobe(up.Funcname, prog, &link.UprobeOptions{Address: up.Address, Offset: up.AbsOffset})
  28. if err != nil {
  29. klog.Errorf("[stack] attachingERROR:%v, %v, %v", err, up, uplink)
  30. // return nil
  31. } else {
  32. links = append(links, uplink)
  33. }
  34. }
  35. return links
  36. }
  37. func (t *Tracer) AttachJVMStackUprobes(path string, uprobes []tracer.Uprobe) []link.Link {
  38. // TODO copy至目标进程读取
  39. //utils.GetDefaultAgentsPath("NativeAgent","libnativeAgent.so")
  40. //path = utils.GetDefaultAgentsPath("NativeAgent", "libnativeAgent.so")
  41. //path = "/tmp/NativeAgentSo2378900480034120722.tmp"
  42. path = utils.GetDefaultAgentsPath("NativeAgent", "libnativeAgent.so")
  43. setNodeEnter := "Java_com_cloudwise_agent_common_natives_TraceNative_setNodeEnter"
  44. setNodeReturn := "Java_com_cloudwise_agent_common_natives_TraceNative_setNodeReturn"
  45. klog.Infoln("Attach Start AttachJVMStackUprobes", path)
  46. var links []link.Link
  47. ex, err := link.OpenExecutable(path)
  48. if err != nil {
  49. klog.Error(err)
  50. return nil
  51. }
  52. klog.Infoln("Attach Start " + setNodeEnter)
  53. uplink, err := ex.Uprobe(setNodeEnter, t.uprobes["setNodeEnter"], &link.UprobeOptions{Offset: 0x0})
  54. if err != nil {
  55. klog.Errorf("attaching ERROR: %v, %v, %v\n", err, setNodeEnter, uplink)
  56. } else {
  57. links = append(links, uplink)
  58. }
  59. klog.Infoln("Attach Start " + setNodeReturn)
  60. uplink, err = ex.Uprobe(setNodeReturn, t.uprobes["setNodeReturn"], &link.UprobeOptions{Offset: 0x0})
  61. if err != nil {
  62. klog.Errorf("attaching ERROR: %v, %v, %v\n", err, setNodeReturn, uplink)
  63. } else {
  64. links = append(links, uplink)
  65. }
  66. return links
  67. }