stack.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package ebpftracer
  2. import (
  3. "fmt"
  4. "github.com/cilium/ebpf"
  5. "github.com/cilium/ebpf/link"
  6. "github.com/coroot/coroot-node-agent/ebpftracer/tracer"
  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. fmt.Println("Attach Start", path)
  15. for i, up := range uprobes {
  16. fmt.Printf("attaching %d -> %d -> %s -> 0x%x -> 0x%x -> 0x%x\n", 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. fmt.Printf("attachingERROR:%v, %v, %v\n", err, up, uplink)
  29. // return nil
  30. } else {
  31. links = append(links, uplink)
  32. }
  33. }
  34. return links
  35. }