1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/python 2*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) PLUMgrid, Inc. 3*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License") 4*387f9dfdSAndroid Build Coastguard Worker 5*387f9dfdSAndroid Build Coastguard Worker# This is an example of tracing an event and printing custom fields. 6*387f9dfdSAndroid Build Coastguard Worker# run in project examples directory with: 7*387f9dfdSAndroid Build Coastguard Worker# sudo ./trace_fields.py" 8*387f9dfdSAndroid Build Coastguard Worker 9*387f9dfdSAndroid Build Coastguard Workerimport atexit 10*387f9dfdSAndroid Build Coastguard Workerfrom bcc import BPF 11*387f9dfdSAndroid Build Coastguard Workerfrom bcc.utils import printb 12*387f9dfdSAndroid Build Coastguard Workerimport ctypes as ct 13*387f9dfdSAndroid Build Coastguard Worker 14*387f9dfdSAndroid Build Coastguard Workerclass Data(ct.Structure): 15*387f9dfdSAndroid Build Coastguard Worker _fields_ = [("ts", ct.c_ulonglong), 16*387f9dfdSAndroid Build Coastguard Worker ("magic", ct.c_ulonglong)] 17*387f9dfdSAndroid Build Coastguard Worker 18*387f9dfdSAndroid Build Coastguard Workercounter = 0 19*387f9dfdSAndroid Build Coastguard Workerdef cb(cpu, data, size): 20*387f9dfdSAndroid Build Coastguard Worker assert size >= ct.sizeof(Data) 21*387f9dfdSAndroid Build Coastguard Worker event = ct.cast(data, ct.POINTER(Data)).contents 22*387f9dfdSAndroid Build Coastguard Worker print("[%0d] %f: %x" % (cpu, float(event.ts) / 1000000, event.magic)) 23*387f9dfdSAndroid Build Coastguard Worker global counter 24*387f9dfdSAndroid Build Coastguard Worker counter += 1 25*387f9dfdSAndroid Build Coastguard Worker 26*387f9dfdSAndroid Build Coastguard Workerprog = """ 27*387f9dfdSAndroid Build Coastguard WorkerBPF_PERF_OUTPUT(events); 28*387f9dfdSAndroid Build Coastguard WorkerBPF_ARRAY(counters, u64, 10); 29*387f9dfdSAndroid Build Coastguard Workerint do_sys_clone(void *ctx) { 30*387f9dfdSAndroid Build Coastguard Worker struct { 31*387f9dfdSAndroid Build Coastguard Worker u64 ts; 32*387f9dfdSAndroid Build Coastguard Worker u64 magic; 33*387f9dfdSAndroid Build Coastguard Worker } data = {bpf_ktime_get_ns(), 0x12345678}; 34*387f9dfdSAndroid Build Coastguard Worker int rc; 35*387f9dfdSAndroid Build Coastguard Worker if ((rc = events.perf_submit(ctx, &data, sizeof(data))) < 0) 36*387f9dfdSAndroid Build Coastguard Worker bpf_trace_printk("perf_output failed: %d\\n", rc); 37*387f9dfdSAndroid Build Coastguard Worker int zero = 0; 38*387f9dfdSAndroid Build Coastguard Worker u64 *val = counters.lookup(&zero); 39*387f9dfdSAndroid Build Coastguard Worker if (val) lock_xadd(val, 1); 40*387f9dfdSAndroid Build Coastguard Worker return 0; 41*387f9dfdSAndroid Build Coastguard Worker} 42*387f9dfdSAndroid Build Coastguard Worker""" 43*387f9dfdSAndroid Build Coastguard Workerb = BPF(text=prog) 44*387f9dfdSAndroid Build Coastguard Workerevent_name = b.get_syscall_fnname("clone") 45*387f9dfdSAndroid Build Coastguard Workerb.attach_kprobe(event=event_name, fn_name="do_sys_clone") 46*387f9dfdSAndroid Build Coastguard Workerb["events"].open_perf_buffer(cb) 47*387f9dfdSAndroid Build Coastguard Worker 48*387f9dfdSAndroid Build Coastguard Worker@atexit.register 49*387f9dfdSAndroid Build Coastguard Workerdef print_counter(): 50*387f9dfdSAndroid Build Coastguard Worker global counter 51*387f9dfdSAndroid Build Coastguard Worker global b 52*387f9dfdSAndroid Build Coastguard Worker print("counter = %d vs %d" % (counter, b["counters"][ct.c_int(0)].value)) 53*387f9dfdSAndroid Build Coastguard Worker 54*387f9dfdSAndroid Build Coastguard Workerprintb(b"Tracing " + event_name + b", try `dd if=/dev/zero of=/dev/null`") 55*387f9dfdSAndroid Build Coastguard Workerprint("Tracing... Hit Ctrl-C to end.") 56*387f9dfdSAndroid Build Coastguard Workerwhile 1: 57*387f9dfdSAndroid Build Coastguard Worker try: 58*387f9dfdSAndroid Build Coastguard Worker b.perf_buffer_poll() 59*387f9dfdSAndroid Build Coastguard Worker except KeyboardInterrupt: 60*387f9dfdSAndroid Build Coastguard Worker exit() 61