A dynamic tracer for Linux

kprobe.c 871B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. type_t *t;
  18. if (is_arg(n->ident))
  19. t = &t_ul;
  20. else if (!strcmp(n->ident, "ctx"))
  21. t = &t_pt_regsp;
  22. else
  23. return -ENOENT;
  24. n->type = t;
  25. return sym_add(prog->locals, n->ident, t, &n->sym);
  26. }
  27. int kprobe_probe(prog_t *prog)
  28. {
  29. struct kprobe *kp;
  30. kp = calloc(1, sizeof(*kp));
  31. assert(kp);
  32. prog->provider_data = kp;
  33. return 0;
  34. }
  35. provider_t kprobe = {
  36. .name = "kprobe",
  37. .resolve = kprobe_resolve,
  38. .probe = kprobe_probe,
  39. };
  40. __attribute__((constructor))
  41. static void kprobe_init(void)
  42. {
  43. provider_register(&kprobe);
  44. }