1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/python 2*387f9dfdSAndroid Build Coastguard Worker 3*387f9dfdSAndroid Build Coastguard Worker# 4*387f9dfdSAndroid Build Coastguard Worker# strlen_hist.py Histogram of system-wide strlen return values 5*387f9dfdSAndroid Build Coastguard Worker# 6*387f9dfdSAndroid Build Coastguard Worker# A basic example of using uprobes along with a histogram to show 7*387f9dfdSAndroid Build Coastguard Worker# distributions. 8*387f9dfdSAndroid Build Coastguard Worker# 9*387f9dfdSAndroid Build Coastguard Worker# Runs until ctrl-c is pressed. 10*387f9dfdSAndroid Build Coastguard Worker# 11*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) PLUMgrid, Inc. 12*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License") 13*387f9dfdSAndroid Build Coastguard Worker# 14*387f9dfdSAndroid Build Coastguard Worker# Example output: 15*387f9dfdSAndroid Build Coastguard Worker# $ sudo ./strlen_hist.py 16*387f9dfdSAndroid Build Coastguard Worker# 22:12:52 17*387f9dfdSAndroid Build Coastguard Worker# strlen return: : count distribution 18*387f9dfdSAndroid Build Coastguard Worker# 0 -> 1 : 2106 |**************** | 19*387f9dfdSAndroid Build Coastguard Worker# 2 -> 3 : 1172 |********* | 20*387f9dfdSAndroid Build Coastguard Worker# 4 -> 7 : 3892 |****************************** | 21*387f9dfdSAndroid Build Coastguard Worker# 8 -> 15 : 5096 |****************************************| 22*387f9dfdSAndroid Build Coastguard Worker# 16 -> 31 : 2201 |***************** | 23*387f9dfdSAndroid Build Coastguard Worker# 32 -> 63 : 547 |**** | 24*387f9dfdSAndroid Build Coastguard Worker# 64 -> 127 : 106 | | 25*387f9dfdSAndroid Build Coastguard Worker# 128 -> 255 : 13 | | 26*387f9dfdSAndroid Build Coastguard Worker# 256 -> 511 : 27 | | 27*387f9dfdSAndroid Build Coastguard Worker# 512 -> 1023 : 6 | | 28*387f9dfdSAndroid Build Coastguard Worker# 1024 -> 2047 : 10 | | 29*387f9dfdSAndroid Build Coastguard Worker# ^C$ 30*387f9dfdSAndroid Build Coastguard Worker# 31*387f9dfdSAndroid Build Coastguard Worker 32*387f9dfdSAndroid Build Coastguard Workerfrom __future__ import print_function 33*387f9dfdSAndroid Build Coastguard Workerimport bcc 34*387f9dfdSAndroid Build Coastguard Workerimport time 35*387f9dfdSAndroid Build Coastguard Worker 36*387f9dfdSAndroid Build Coastguard Workertext = """ 37*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h> 38*387f9dfdSAndroid Build Coastguard WorkerBPF_HISTOGRAM(dist); 39*387f9dfdSAndroid Build Coastguard Workerint count(struct pt_regs *ctx) { 40*387f9dfdSAndroid Build Coastguard Worker dist.increment(bpf_log2l(PT_REGS_RC(ctx))); 41*387f9dfdSAndroid Build Coastguard Worker return 0; 42*387f9dfdSAndroid Build Coastguard Worker} 43*387f9dfdSAndroid Build Coastguard Worker""" 44*387f9dfdSAndroid Build Coastguard Worker 45*387f9dfdSAndroid Build Coastguard Workerb = bcc.BPF(text=text) 46*387f9dfdSAndroid Build Coastguard Workersym="strlen" 47*387f9dfdSAndroid Build Coastguard Workerb.attach_uretprobe(name="c", sym=sym, fn_name="count") 48*387f9dfdSAndroid Build Coastguard Worker 49*387f9dfdSAndroid Build Coastguard Workerdist = b["dist"] 50*387f9dfdSAndroid Build Coastguard Worker 51*387f9dfdSAndroid Build Coastguard Workertry: 52*387f9dfdSAndroid Build Coastguard Worker while True: 53*387f9dfdSAndroid Build Coastguard Worker time.sleep(1) 54*387f9dfdSAndroid Build Coastguard Worker print("%-8s\n" % time.strftime("%H:%M:%S"), end="") 55*387f9dfdSAndroid Build Coastguard Worker dist.print_log2_hist(sym + " return:") 56*387f9dfdSAndroid Build Coastguard Worker dist.clear() 57*387f9dfdSAndroid Build Coastguard Worker 58*387f9dfdSAndroid Build Coastguard Workerexcept KeyboardInterrupt: 59*387f9dfdSAndroid Build Coastguard Worker pass 60