1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/env python 2*387f9dfdSAndroid Build Coastguard Worker# @lint-avoid-python-3-compatibility-imports 3*387f9dfdSAndroid Build Coastguard Worker# 4*387f9dfdSAndroid Build Coastguard Worker# syncsnoop Trace sync() syscall. 5*387f9dfdSAndroid Build Coastguard Worker# For Linux, uses BCC, eBPF. Embedded C. 6*387f9dfdSAndroid Build Coastguard Worker# 7*387f9dfdSAndroid Build Coastguard Worker# Written as a basic example of BCC trace & reformat. See 8*387f9dfdSAndroid Build Coastguard Worker# examples/hello_world.py for a BCC trace with default output example. 9*387f9dfdSAndroid Build Coastguard Worker# 10*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) 2015 Brendan Gregg. 11*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License") 12*387f9dfdSAndroid Build Coastguard Worker# 13*387f9dfdSAndroid Build Coastguard Worker# 13-Aug-2015 Brendan Gregg Created this. 14*387f9dfdSAndroid Build Coastguard Worker# 19-Feb-2016 Allan McAleavy migrated to BPF_PERF_OUTPUT 15*387f9dfdSAndroid Build Coastguard Worker 16*387f9dfdSAndroid Build Coastguard Workerfrom __future__ import print_function 17*387f9dfdSAndroid Build Coastguard Workerfrom bcc import BPF 18*387f9dfdSAndroid Build Coastguard Workerimport sys 19*387f9dfdSAndroid Build Coastguard Worker 20*387f9dfdSAndroid Build Coastguard Worker# load BPF program 21*387f9dfdSAndroid Build Coastguard Workerb = BPF(text=""" 22*387f9dfdSAndroid Build Coastguard Workerstruct data_t { 23*387f9dfdSAndroid Build Coastguard Worker u64 ts; 24*387f9dfdSAndroid Build Coastguard Worker}; 25*387f9dfdSAndroid Build Coastguard Worker 26*387f9dfdSAndroid Build Coastguard WorkerBPF_PERF_OUTPUT(events); 27*387f9dfdSAndroid Build Coastguard Worker 28*387f9dfdSAndroid Build Coastguard Workervoid syscall__sync(void *ctx) { 29*387f9dfdSAndroid Build Coastguard Worker struct data_t data = {}; 30*387f9dfdSAndroid Build Coastguard Worker data.ts = bpf_ktime_get_ns() / 1000; 31*387f9dfdSAndroid Build Coastguard Worker events.perf_submit(ctx, &data, sizeof(data)); 32*387f9dfdSAndroid Build Coastguard Worker}; 33*387f9dfdSAndroid Build Coastguard Worker""") 34*387f9dfdSAndroid Build Coastguard Workerb.attach_kprobe(event=b.get_syscall_fnname("sync"), 35*387f9dfdSAndroid Build Coastguard Worker fn_name="syscall__sync") 36*387f9dfdSAndroid Build Coastguard Worker 37*387f9dfdSAndroid Build Coastguard Worker# header 38*387f9dfdSAndroid Build Coastguard Workerprint("%-18s %s" % ("TIME(s)", "CALL")) 39*387f9dfdSAndroid Build Coastguard Worker 40*387f9dfdSAndroid Build Coastguard Worker# process event 41*387f9dfdSAndroid Build Coastguard Workerdef print_event(cpu, data, size): 42*387f9dfdSAndroid Build Coastguard Worker event = b["events"].event(data) 43*387f9dfdSAndroid Build Coastguard Worker print("%-18.9f sync()" % (float(event.ts) / 1000000)) 44*387f9dfdSAndroid Build Coastguard Worker sys.stdout.flush() 45*387f9dfdSAndroid Build Coastguard Worker 46*387f9dfdSAndroid Build Coastguard Worker# loop with callback to print_event 47*387f9dfdSAndroid Build Coastguard Workerb["events"].open_perf_buffer(print_event) 48*387f9dfdSAndroid Build Coastguard Workerwhile 1: 49*387f9dfdSAndroid Build Coastguard Worker try: 50*387f9dfdSAndroid Build Coastguard Worker b.perf_buffer_poll() 51*387f9dfdSAndroid Build Coastguard Worker except KeyboardInterrupt: 52*387f9dfdSAndroid Build Coastguard Worker exit() 53