test.php 1.0 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 Ebpf($prog);
  30. $ebpf->attach_kprobe("blk_account_io_done","do_sys_clone");
  31. $ebpf->perf_event("events")->open_perf_buffer("cb");
  32. echo("Tracing... Hit Ctrl-C to end.\n");
  33. while (true) {
  34. try {
  35. $ebpf->perf_buffer_poll();
  36. flush();
  37. } catch (Exception $e) {
  38. exit;
  39. }
  40. }