| #!/usr/bin/python | 
 | # Copyright (c) PLUMgrid, Inc. | 
 | # Licensed under the Apache License, Version 2.0 (the "License") | 
 |  | 
 | # This is an example of tracing an event and printing custom fields. | 
 | # run in project examples directory with: | 
 | # sudo ./trace_fields.py" | 
 |  | 
 | import atexit | 
 | from bcc import BPF | 
 | from bcc.utils import printb | 
 | import ctypes as ct | 
 |  | 
 | class Data(ct.Structure): | 
 |     _fields_ = [("ts", ct.c_ulonglong), | 
 |                 ("magic", ct.c_ulonglong)] | 
 |  | 
 | counter = 0 | 
 | def cb(cpu, data, size): | 
 |     assert size >= ct.sizeof(Data) | 
 |     event = ct.cast(data, ct.POINTER(Data)).contents | 
 |     print("[%0d] %f: %x" % (cpu, float(event.ts) / 1000000, event.magic)) | 
 |     global counter | 
 |     counter += 1 | 
 |  | 
 | prog = """ | 
 | BPF_PERF_OUTPUT(events); | 
 | BPF_ARRAY(counters, u64, 10); | 
 | int do_sys_clone(void *ctx) { | 
 |   struct { | 
 |     u64 ts; | 
 |     u64 magic; | 
 |   } data = {bpf_ktime_get_ns(), 0x12345678}; | 
 |   int rc; | 
 |   if ((rc = events.perf_submit(ctx, &data, sizeof(data))) < 0) | 
 |     bpf_trace_printk("perf_output failed: %d\\n", rc); | 
 |   int zero = 0; | 
 |   u64 *val = counters.lookup(&zero); | 
 |   if (val) lock_xadd(val, 1); | 
 |   return 0; | 
 | } | 
 | """ | 
 | b = BPF(text=prog) | 
 | event_name = b.get_syscall_fnname("clone") | 
 | b.attach_kprobe(event=event_name, fn_name="do_sys_clone") | 
 | b["events"].open_perf_buffer(cb) | 
 |  | 
 | @atexit.register | 
 | def print_counter(): | 
 |     global counter | 
 |     global b | 
 |     print("counter = %d vs %d" % (counter, b["counters"][ct.c_int(0)].value)) | 
 |  | 
 | printb(b"Tracing " + event_name + b", try `dd if=/dev/zero of=/dev/null`") | 
 | print("Tracing... Hit Ctrl-C to end.") | 
 | while 1: | 
 |     try: | 
 |         b.perf_buffer_poll() | 
 |     except KeyboardInterrupt: | 
 |         exit() |