A dynamic tracer for Linux

kprobe.c 928B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include <assert.h>
  2. #include <errno.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <linux/ptrace.h>
  6. #include "ply.h"
  7. struct kprobe {
  8. };
  9. static inline int is_arg(const char *name)
  10. {
  11. return (strstr(name, "arg") == name)
  12. && (strlen(name) == 4)
  13. && (name[3] >= '0' && name[3] <= '9');
  14. }
  15. int kprobe_resolve(prog_t *prog, node_t *n)
  16. {
  17. struct kprobe *kp = prog->provider_data;
  18. type_t *t;
  19. char *name;
  20. name = n->atom.ident;
  21. if (is_arg(name))
  22. t = &t_ul;
  23. else if (!strcmp(name, "ctx"))
  24. t = &t_pt_regs;
  25. else
  26. return -ENOENT;
  27. n->type = t;
  28. return sym_add(prog->locals, name, t);
  29. }
  30. int kprobe_probe(prog_t *prog)
  31. {
  32. struct kprobe *kp;
  33. kp = calloc(1, sizeof(*kp));
  34. assert(kp);
  35. prog->provider_data = kp;
  36. return 0;
  37. }
  38. provider_t kprobe = {
  39. .name = "kprobe",
  40. .resolve = kprobe_resolve,
  41. .probe = kprobe_probe,
  42. };
  43. __attribute__((constructor))
  44. static void kprobe_init(void)
  45. {
  46. provider_register(&kprobe);
  47. }