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# vfscount Count VFS calls ("vfs_*"). 5*387f9dfdSAndroid Build Coastguard Worker# For Linux, uses BCC, eBPF. See .c file. 6*387f9dfdSAndroid Build Coastguard Worker# 7*387f9dfdSAndroid Build Coastguard Worker# Written as a basic example of counting functions. 8*387f9dfdSAndroid Build Coastguard Worker# 9*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) 2015 Brendan Gregg. 10*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License") 11*387f9dfdSAndroid Build Coastguard Worker# 12*387f9dfdSAndroid Build Coastguard Worker# 14-Aug-2015 Brendan Gregg Created this. 13*387f9dfdSAndroid Build Coastguard Worker 14*387f9dfdSAndroid Build Coastguard Workerfrom __future__ import print_function 15*387f9dfdSAndroid Build Coastguard Workerfrom bcc import BPF 16*387f9dfdSAndroid Build Coastguard Workerfrom time import sleep 17*387f9dfdSAndroid Build Coastguard Workerfrom sys import argv 18*387f9dfdSAndroid Build Coastguard Workerdef usage(): 19*387f9dfdSAndroid Build Coastguard Worker print("USAGE: %s [time]" % argv[0]) 20*387f9dfdSAndroid Build Coastguard Worker exit() 21*387f9dfdSAndroid Build Coastguard Worker 22*387f9dfdSAndroid Build Coastguard Workerinterval = 99999999 23*387f9dfdSAndroid Build Coastguard Workerif len(argv) > 1: 24*387f9dfdSAndroid Build Coastguard Worker try: 25*387f9dfdSAndroid Build Coastguard Worker interval = int(argv[1]) 26*387f9dfdSAndroid Build Coastguard Worker if interval == 0: 27*387f9dfdSAndroid Build Coastguard Worker raise 28*387f9dfdSAndroid Build Coastguard Worker except: # also catches -h, --help 29*387f9dfdSAndroid Build Coastguard Worker usage() 30*387f9dfdSAndroid Build Coastguard Worker# load BPF program 31*387f9dfdSAndroid Build Coastguard Workerb = BPF(text=""" 32*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h> 33*387f9dfdSAndroid Build Coastguard Worker 34*387f9dfdSAndroid Build Coastguard Workerstruct key_t { 35*387f9dfdSAndroid Build Coastguard Worker u64 ip; 36*387f9dfdSAndroid Build Coastguard Worker}; 37*387f9dfdSAndroid Build Coastguard Worker 38*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(counts, struct key_t, u64, 256); 39*387f9dfdSAndroid Build Coastguard Worker 40*387f9dfdSAndroid Build Coastguard Workerint do_count(struct pt_regs *ctx) { 41*387f9dfdSAndroid Build Coastguard Worker struct key_t key = {}; 42*387f9dfdSAndroid Build Coastguard Worker key.ip = PT_REGS_IP(ctx); 43*387f9dfdSAndroid Build Coastguard Worker counts.atomic_increment(key); 44*387f9dfdSAndroid Build Coastguard Worker return 0; 45*387f9dfdSAndroid Build Coastguard Worker} 46*387f9dfdSAndroid Build Coastguard Worker""") 47*387f9dfdSAndroid Build Coastguard Workerb.attach_kprobe(event_re="^vfs_.*", fn_name="do_count") 48*387f9dfdSAndroid Build Coastguard Worker 49*387f9dfdSAndroid Build Coastguard Worker# header 50*387f9dfdSAndroid Build Coastguard Workerprint("Tracing... Ctrl-C to end.") 51*387f9dfdSAndroid Build Coastguard Worker 52*387f9dfdSAndroid Build Coastguard Worker# output 53*387f9dfdSAndroid Build Coastguard Workertry: 54*387f9dfdSAndroid Build Coastguard Worker sleep(interval) 55*387f9dfdSAndroid Build Coastguard Workerexcept KeyboardInterrupt: 56*387f9dfdSAndroid Build Coastguard Worker pass 57*387f9dfdSAndroid Build Coastguard Worker 58*387f9dfdSAndroid Build Coastguard Workerprint("\n%-16s %-26s %8s" % ("ADDR", "FUNC", "COUNT")) 59*387f9dfdSAndroid Build Coastguard Workercounts = b.get_table("counts") 60*387f9dfdSAndroid Build Coastguard Workerfor k, v in sorted(counts.items(), key=lambda counts: counts[1].value): 61*387f9dfdSAndroid Build Coastguard Worker print("%-16x %-26s %8d" % (k.ip, b.ksym(k.ip), v.value)) 62