Beispiel #1
0
Datei: libbpf.c Projekt: AoJ/bcc
static void * bpf_attach_probe(int progfd, const char *event,
                               const char *event_desc, const char *event_type,
                               pid_t pid, int cpu, int group_fd,
                               perf_reader_cb cb, void *cb_cookie) {
  int kfd = -1;
  char buf[256];
  struct perf_reader *reader = NULL;

  reader = perf_reader_new(cb, NULL, cb_cookie);
  if (!reader)
    goto error;

  snprintf(buf, sizeof(buf), "/sys/kernel/debug/tracing/%s_events", event_type);
  kfd = open(buf, O_WRONLY | O_APPEND, 0);
  if (kfd < 0) {
    fprintf(stderr, "open(%s): %s\n", buf, strerror(errno));
    goto error;
  }

  if (write(kfd, event_desc, strlen(event_desc)) < 0) {
    fprintf(stderr, "write(%s, \"%s\") failed: %s\n", buf, event_desc, strerror(errno));
    if (errno == EINVAL)
      fprintf(stderr, "check dmesg output for possible cause\n");
    goto error;
  }

  snprintf(buf, sizeof(buf), "/sys/kernel/debug/tracing/events/%ss/%s", event_type, event);
  if (bpf_attach_tracing_event(progfd, buf, reader, pid, cpu, group_fd) < 0)
    goto error;

  return reader;

error:
  if (kfd >= 0)
    close(kfd);
  if (reader)
    perf_reader_free(reader);

  return NULL;
}
Beispiel #2
0
void * bpf_attach_kprobe(int progfd, const char *event,
                         const char *event_desc, pid_t pid,
                         int cpu, int group_fd, perf_reader_cb cb,
                         void *cb_cookie) {
  int rc = -1, kfd = -1;
  char buf[256];
  struct perf_reader *reader = NULL;

  reader = perf_reader_new(-1, 8, cb, cb_cookie);
  if (!reader)
    goto cleanup;

  kfd = open("/sys/kernel/debug/tracing/kprobe_events", O_WRONLY | O_APPEND, 0);
  if (kfd < 0) {
    perror("open(kprobe_events)");
    goto cleanup;
  }

  if (write(kfd, event_desc, strlen(event_desc)) < 0) {
    fprintf(stderr, "write of \"%s\" into kprobe_events failed: %s\n", event_desc, strerror(errno));
    if (errno == EINVAL)
      fprintf(stderr, "check dmesg output for possible cause\n");
    goto cleanup;
  }

  snprintf(buf, sizeof(buf), "/sys/kernel/debug/tracing/events/kprobes/%s", event);
  rc = bpf_attach_tracing_event(progfd, buf, reader, pid, cpu, group_fd);

cleanup:
  if (kfd >= 0)
    close(kfd);
  if (reader && rc < 0) {
    perf_reader_free(reader);
    reader = NULL;
  }

  return reader;
}