trace_perf_output.php 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. <?php
  2. function cb($cpu,$data,$size) {
  3. $event = unpack("Qcpu/Qts/Qmagic/A16msg", $data);
  4. if ($event === false) {
  5. echo "error.\n";
  6. return;
  7. }
  8. printf("[%d] %.6f: %x %s\n", $event['cpu'], $event['ts'] / 1000000, $event['magic'],$event['msg']);
  9. }
  10. $prog = <<<EOT
  11. BPF_PERF_OUTPUT(events);
  12. BPF_ARRAY(counters, u64, 10);
  13. int do_sys_clone(void *ctx) {
  14. struct {
  15. u64 cpu;
  16. u64 ts;
  17. u64 magic;
  18. char msg[16];
  19. } data = {bpf_get_smp_processor_id(),bpf_ktime_get_ns(), 0x12345678,"Hello, world!"};
  20. int rc;
  21. if ((rc = events.perf_submit(ctx, &data, sizeof(data))) < 0)
  22. bpf_trace_printk("perf_output failed: %d\\n", rc);
  23. int zero = 0;
  24. u64 *val = counters.lookup(&zero);
  25. if (val) lock_xadd(val, 1);
  26. return 0;
  27. }
  28. EOT;
  29. $ebpf = new Bpf(["text" => $prog]);
  30. $event_name = $ebpf->get_syscall_fnname("clone");
  31. $ebpf->attach_kprobe($event_name,"do_sys_clone");
  32. $ebpf->events->open_perf_buffer("cb");
  33. echo("Tracing... Hit Ctrl-C to end.\n");
  34. while (true) {
  35. try {
  36. $ebpf->perf_buffer_poll();
  37. flush();
  38. } catch (Exception $e) {
  39. exit;
  40. }
  41. }