stack.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. klog "github.com/sirupsen/logrus"
  7. )
  8. func (t *Tracer) AttachStackUprobes(path string, uprobes []tracer.Uprobe) []link.Link {
  9. var links []link.Link
  10. ex, err := link.OpenExecutable(path)
  11. if err != nil {
  12. return nil
  13. }
  14. klog.Infoln("[stack] Attach Start", path)
  15. for i, up := range uprobes {
  16. 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)
  17. var prog *ebpf.Program
  18. switch up.Location {
  19. case tracer.AtEntry:
  20. prog = t.uprobes["ent"]
  21. case tracer.AtRet:
  22. prog = t.uprobes["ret"]
  23. case tracer.AtDotNetEntry:
  24. prog = t.uprobes["dotnetent"]
  25. }
  26. uplink, err := ex.Uprobe(up.Funcname, prog, &link.UprobeOptions{Address: up.Address, Offset: up.AbsOffset})
  27. if err != nil {
  28. klog.Errorf("[stack] attachingERROR:%v, %v, %v", err, up, uplink)
  29. // return nil
  30. } else {
  31. links = append(links, uplink)
  32. }
  33. }
  34. return links
  35. }
  36. func (t *Tracer) AttachJVMStackUprobes(path string, uprobes []tracer.Uprobe) []link.Link {
  37. path = "/opt/cloudwise/smartagent/agent/NativeAgent/libnativeAgent.so"
  38. setNodeEnter := "Java_com_cloudwise_agent_common_natives_TraceNative_setNodeEnter"
  39. setNodeReturn := "Java_com_cloudwise_agent_common_natives_TraceNative_setNodeReturn"
  40. klog.Infoln("Attach Start AttachJVMStackUprobes", path)
  41. var links []link.Link
  42. ex, err := link.OpenExecutable(path)
  43. if err != nil {
  44. return nil
  45. }
  46. klog.Infoln("Attach Start " + setNodeEnter)
  47. uplink, err := ex.Uprobe(setNodeEnter, t.uprobes["setNodeEnter"], &link.UprobeOptions{Offset: 0x0})
  48. if err != nil {
  49. klog.Errorf("attaching ERROR: %v, %v, %v\n", err, setNodeEnter, uplink)
  50. } else {
  51. links = append(links, uplink)
  52. }
  53. klog.Infoln("Attach Start " + setNodeReturn)
  54. uplink, err = ex.Uprobe(setNodeReturn, t.uprobes["setNodeReturn"], &link.UprobeOptions{Offset: 0x0})
  55. if err != nil {
  56. klog.Errorf("attaching ERROR: %v, %v, %v\n", err, setNodeReturn, uplink)
  57. } else {
  58. links = append(links, uplink)
  59. }
  60. return links
  61. }