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# shmsnoop Trace shm*() syscalls. 5*387f9dfdSAndroid Build Coastguard Worker# For Linux, uses BCC, eBPF. Embedded C. 6*387f9dfdSAndroid Build Coastguard Worker# 7*387f9dfdSAndroid Build Coastguard Worker# USAGE: shmsnoop [-h] [-T] [-x] [-p PID] [-d DURATION] [-t TID] [-n NAME] 8*387f9dfdSAndroid Build Coastguard Worker# 9*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) 2018 Jiri Olsa. 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# 08-Oct-2018 Jiri Olsa Created this. 13*387f9dfdSAndroid Build Coastguard Worker 14*387f9dfdSAndroid Build Coastguard Workerfrom __future__ import print_function 15*387f9dfdSAndroid Build Coastguard Workerfrom bcc import ArgString, BPF 16*387f9dfdSAndroid Build Coastguard Workerimport argparse 17*387f9dfdSAndroid Build Coastguard Workerfrom datetime import datetime, timedelta 18*387f9dfdSAndroid Build Coastguard Worker 19*387f9dfdSAndroid Build Coastguard Worker# arguments 20*387f9dfdSAndroid Build Coastguard Workerexamples = """examples: 21*387f9dfdSAndroid Build Coastguard Worker ./shmsnoop # trace all shm*() syscalls 22*387f9dfdSAndroid Build Coastguard Worker ./shmsnoop -T # include timestamps 23*387f9dfdSAndroid Build Coastguard Worker ./shmsnoop -p 181 # only trace PID 181 24*387f9dfdSAndroid Build Coastguard Worker ./shmsnoop -t 123 # only trace TID 123 25*387f9dfdSAndroid Build Coastguard Worker ./shmsnoop -d 10 # trace for 10 seconds only 26*387f9dfdSAndroid Build Coastguard Worker ./shmsnoop -n main # only print process names containing "main" 27*387f9dfdSAndroid Build Coastguard Worker""" 28*387f9dfdSAndroid Build Coastguard Workerparser = argparse.ArgumentParser( 29*387f9dfdSAndroid Build Coastguard Worker description="Trace shm*() syscalls", 30*387f9dfdSAndroid Build Coastguard Worker formatter_class=argparse.RawDescriptionHelpFormatter, 31*387f9dfdSAndroid Build Coastguard Worker epilog=examples) 32*387f9dfdSAndroid Build Coastguard Workerparser.add_argument("-T", "--timestamp", action="store_true", 33*387f9dfdSAndroid Build Coastguard Worker help="include timestamp on output") 34*387f9dfdSAndroid Build Coastguard Workerparser.add_argument("-p", "--pid", 35*387f9dfdSAndroid Build Coastguard Worker help="trace this PID only") 36*387f9dfdSAndroid Build Coastguard Workerparser.add_argument("-t", "--tid", 37*387f9dfdSAndroid Build Coastguard Worker help="trace this TID only") 38*387f9dfdSAndroid Build Coastguard Workerparser.add_argument("-d", "--duration", 39*387f9dfdSAndroid Build Coastguard Worker help="total duration of trace in seconds") 40*387f9dfdSAndroid Build Coastguard Workerparser.add_argument("-n", "--name", 41*387f9dfdSAndroid Build Coastguard Worker type=ArgString, 42*387f9dfdSAndroid Build Coastguard Worker help="only print process names containing this name") 43*387f9dfdSAndroid Build Coastguard Workerparser.add_argument("--ebpf", action="store_true", 44*387f9dfdSAndroid Build Coastguard Worker help=argparse.SUPPRESS) 45*387f9dfdSAndroid Build Coastguard Workerargs = parser.parse_args() 46*387f9dfdSAndroid Build Coastguard Workerdebug = 0 47*387f9dfdSAndroid Build Coastguard Workerif args.duration: 48*387f9dfdSAndroid Build Coastguard Worker args.duration = timedelta(seconds=int(args.duration)) 49*387f9dfdSAndroid Build Coastguard Worker 50*387f9dfdSAndroid Build Coastguard Worker# define BPF program 51*387f9dfdSAndroid Build Coastguard Workerbpf_text = """ 52*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h> 53*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/limits.h> 54*387f9dfdSAndroid Build Coastguard Worker#include <linux/sched.h> 55*387f9dfdSAndroid Build Coastguard Worker 56*387f9dfdSAndroid Build Coastguard Workerstruct val_t { 57*387f9dfdSAndroid Build Coastguard Worker u64 id; 58*387f9dfdSAndroid Build Coastguard Worker u64 ts; 59*387f9dfdSAndroid Build Coastguard Worker int sys; 60*387f9dfdSAndroid Build Coastguard Worker unsigned long key; 61*387f9dfdSAndroid Build Coastguard Worker unsigned long size; 62*387f9dfdSAndroid Build Coastguard Worker unsigned long shmflg; 63*387f9dfdSAndroid Build Coastguard Worker unsigned long shmid; 64*387f9dfdSAndroid Build Coastguard Worker unsigned long cmd; 65*387f9dfdSAndroid Build Coastguard Worker unsigned long buf; 66*387f9dfdSAndroid Build Coastguard Worker unsigned long shmaddr; 67*387f9dfdSAndroid Build Coastguard Worker unsigned long ret; 68*387f9dfdSAndroid Build Coastguard Worker char comm[TASK_COMM_LEN]; 69*387f9dfdSAndroid Build Coastguard Worker}; 70*387f9dfdSAndroid Build Coastguard Worker 71*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(infotmp, u64, struct val_t); 72*387f9dfdSAndroid Build Coastguard WorkerBPF_PERF_OUTPUT(events); 73*387f9dfdSAndroid Build Coastguard Worker 74*387f9dfdSAndroid Build Coastguard Workerenum { 75*387f9dfdSAndroid Build Coastguard Worker SYS_SHMGET, 76*387f9dfdSAndroid Build Coastguard Worker SYS_SHMAT, 77*387f9dfdSAndroid Build Coastguard Worker SYS_SHMDT, 78*387f9dfdSAndroid Build Coastguard Worker SYS_SHMCTL, 79*387f9dfdSAndroid Build Coastguard Worker}; 80*387f9dfdSAndroid Build Coastguard Worker 81*387f9dfdSAndroid Build Coastguard Workerstatic int enter(struct val_t *val) 82*387f9dfdSAndroid Build Coastguard Worker{ 83*387f9dfdSAndroid Build Coastguard Worker u64 id = bpf_get_current_pid_tgid(); 84*387f9dfdSAndroid Build Coastguard Worker u32 pid = id >> 32; // PID is higher part 85*387f9dfdSAndroid Build Coastguard Worker u32 tid = id; // Cast and get the lower part 86*387f9dfdSAndroid Build Coastguard Worker 87*387f9dfdSAndroid Build Coastguard Worker FILTER 88*387f9dfdSAndroid Build Coastguard Worker 89*387f9dfdSAndroid Build Coastguard Worker val->id = id; 90*387f9dfdSAndroid Build Coastguard Worker infotmp.update(&id, val); 91*387f9dfdSAndroid Build Coastguard Worker return 0; 92*387f9dfdSAndroid Build Coastguard Worker} 93*387f9dfdSAndroid Build Coastguard Worker 94*387f9dfdSAndroid Build Coastguard Workerint trace_return(struct pt_regs *ctx) 95*387f9dfdSAndroid Build Coastguard Worker{ 96*387f9dfdSAndroid Build Coastguard Worker u64 id = bpf_get_current_pid_tgid(); 97*387f9dfdSAndroid Build Coastguard Worker u64 tsp = bpf_ktime_get_ns(); 98*387f9dfdSAndroid Build Coastguard Worker struct val_t *val; 99*387f9dfdSAndroid Build Coastguard Worker 100*387f9dfdSAndroid Build Coastguard Worker val = infotmp.lookup(&id); 101*387f9dfdSAndroid Build Coastguard Worker if (val == 0) 102*387f9dfdSAndroid Build Coastguard Worker return 0; 103*387f9dfdSAndroid Build Coastguard Worker 104*387f9dfdSAndroid Build Coastguard Worker if (bpf_get_current_comm(&val->comm, sizeof(val->comm)) != 0) 105*387f9dfdSAndroid Build Coastguard Worker goto out; 106*387f9dfdSAndroid Build Coastguard Worker 107*387f9dfdSAndroid Build Coastguard Worker val->ts = tsp / 1000; 108*387f9dfdSAndroid Build Coastguard Worker val->ret = PT_REGS_RC(ctx); 109*387f9dfdSAndroid Build Coastguard Worker events.perf_submit(ctx, val, sizeof(*val)); 110*387f9dfdSAndroid Build Coastguard Worker 111*387f9dfdSAndroid Build Coastguard Workerout: 112*387f9dfdSAndroid Build Coastguard Worker infotmp.delete(&id); 113*387f9dfdSAndroid Build Coastguard Worker return 0; 114*387f9dfdSAndroid Build Coastguard Worker} 115*387f9dfdSAndroid Build Coastguard Worker 116*387f9dfdSAndroid Build Coastguard Workerint syscall__shmget(struct pt_regs *ctx, u64 key, u64 size, u64 shmflg) 117*387f9dfdSAndroid Build Coastguard Worker{ 118*387f9dfdSAndroid Build Coastguard Worker struct val_t val = { 119*387f9dfdSAndroid Build Coastguard Worker .sys = SYS_SHMGET, 120*387f9dfdSAndroid Build Coastguard Worker }; 121*387f9dfdSAndroid Build Coastguard Worker 122*387f9dfdSAndroid Build Coastguard Worker val.key = key; 123*387f9dfdSAndroid Build Coastguard Worker val.size = size; 124*387f9dfdSAndroid Build Coastguard Worker val.shmflg = shmflg; 125*387f9dfdSAndroid Build Coastguard Worker return enter(&val); 126*387f9dfdSAndroid Build Coastguard Worker}; 127*387f9dfdSAndroid Build Coastguard Worker 128*387f9dfdSAndroid Build Coastguard Workerint syscall__shmat(struct pt_regs *ctx, u64 shmid, u64 shmaddr, u64 shmflg) 129*387f9dfdSAndroid Build Coastguard Worker{ 130*387f9dfdSAndroid Build Coastguard Worker struct val_t val = { 131*387f9dfdSAndroid Build Coastguard Worker .sys = SYS_SHMAT, 132*387f9dfdSAndroid Build Coastguard Worker }; 133*387f9dfdSAndroid Build Coastguard Worker 134*387f9dfdSAndroid Build Coastguard Worker val.shmid = shmid; 135*387f9dfdSAndroid Build Coastguard Worker val.shmaddr = shmaddr; 136*387f9dfdSAndroid Build Coastguard Worker val.shmflg = shmflg; 137*387f9dfdSAndroid Build Coastguard Worker return enter(&val); 138*387f9dfdSAndroid Build Coastguard Worker}; 139*387f9dfdSAndroid Build Coastguard Worker 140*387f9dfdSAndroid Build Coastguard Workerint syscall__shmdt(struct pt_regs *ctx, u64 shmaddr) 141*387f9dfdSAndroid Build Coastguard Worker{ 142*387f9dfdSAndroid Build Coastguard Worker struct val_t val = { 143*387f9dfdSAndroid Build Coastguard Worker .sys = SYS_SHMDT, 144*387f9dfdSAndroid Build Coastguard Worker }; 145*387f9dfdSAndroid Build Coastguard Worker 146*387f9dfdSAndroid Build Coastguard Worker val.shmaddr = shmaddr; 147*387f9dfdSAndroid Build Coastguard Worker return enter(&val); 148*387f9dfdSAndroid Build Coastguard Worker}; 149*387f9dfdSAndroid Build Coastguard Worker 150*387f9dfdSAndroid Build Coastguard Workerint syscall__shmctl(struct pt_regs *ctx, u64 shmid, u64 cmd, u64 buf) 151*387f9dfdSAndroid Build Coastguard Worker{ 152*387f9dfdSAndroid Build Coastguard Worker struct val_t val = { 153*387f9dfdSAndroid Build Coastguard Worker .sys = SYS_SHMCTL, 154*387f9dfdSAndroid Build Coastguard Worker }; 155*387f9dfdSAndroid Build Coastguard Worker 156*387f9dfdSAndroid Build Coastguard Worker val.shmid = shmid; 157*387f9dfdSAndroid Build Coastguard Worker val.cmd = cmd; 158*387f9dfdSAndroid Build Coastguard Worker val.buf = buf; 159*387f9dfdSAndroid Build Coastguard Worker return enter(&val); 160*387f9dfdSAndroid Build Coastguard Worker}; 161*387f9dfdSAndroid Build Coastguard Worker 162*387f9dfdSAndroid Build Coastguard Worker""" 163*387f9dfdSAndroid Build Coastguard Workerif args.tid: # TID trumps PID 164*387f9dfdSAndroid Build Coastguard Worker bpf_text = bpf_text.replace('FILTER', 165*387f9dfdSAndroid Build Coastguard Worker 'if (tid != %s) { return 0; }' % args.tid) 166*387f9dfdSAndroid Build Coastguard Workerelif args.pid: 167*387f9dfdSAndroid Build Coastguard Worker bpf_text = bpf_text.replace('FILTER', 168*387f9dfdSAndroid Build Coastguard Worker 'if (pid != %s) { return 0; }' % args.pid) 169*387f9dfdSAndroid Build Coastguard Workerelse: 170*387f9dfdSAndroid Build Coastguard Worker bpf_text = bpf_text.replace('FILTER', '') 171*387f9dfdSAndroid Build Coastguard Worker 172*387f9dfdSAndroid Build Coastguard Workerif debug or args.ebpf: 173*387f9dfdSAndroid Build Coastguard Worker print(bpf_text) 174*387f9dfdSAndroid Build Coastguard Worker if args.ebpf: 175*387f9dfdSAndroid Build Coastguard Worker exit() 176*387f9dfdSAndroid Build Coastguard Worker 177*387f9dfdSAndroid Build Coastguard Worker# initialize BPF 178*387f9dfdSAndroid Build Coastguard Workerb = BPF(text=bpf_text) 179*387f9dfdSAndroid Build Coastguard Worker 180*387f9dfdSAndroid Build Coastguard Workersyscall_fnname = b.get_syscall_fnname("shmget") 181*387f9dfdSAndroid Build Coastguard Workerif BPF.ksymname(syscall_fnname) != -1: 182*387f9dfdSAndroid Build Coastguard Worker b.attach_kprobe(event=syscall_fnname, fn_name="syscall__shmget") 183*387f9dfdSAndroid Build Coastguard Worker b.attach_kretprobe(event=syscall_fnname, fn_name="trace_return") 184*387f9dfdSAndroid Build Coastguard Worker 185*387f9dfdSAndroid Build Coastguard Workersyscall_fnname = b.get_syscall_fnname("shmat") 186*387f9dfdSAndroid Build Coastguard Workerif BPF.ksymname(syscall_fnname) != -1: 187*387f9dfdSAndroid Build Coastguard Worker b.attach_kprobe(event=syscall_fnname, fn_name="syscall__shmat") 188*387f9dfdSAndroid Build Coastguard Worker b.attach_kretprobe(event=syscall_fnname, fn_name="trace_return") 189*387f9dfdSAndroid Build Coastguard Worker 190*387f9dfdSAndroid Build Coastguard Workersyscall_fnname = b.get_syscall_fnname("shmdt") 191*387f9dfdSAndroid Build Coastguard Workerif BPF.ksymname(syscall_fnname) != -1: 192*387f9dfdSAndroid Build Coastguard Worker b.attach_kprobe(event=syscall_fnname, fn_name="syscall__shmdt") 193*387f9dfdSAndroid Build Coastguard Worker b.attach_kretprobe(event=syscall_fnname, fn_name="trace_return") 194*387f9dfdSAndroid Build Coastguard Worker 195*387f9dfdSAndroid Build Coastguard Workersyscall_fnname = b.get_syscall_fnname("shmctl") 196*387f9dfdSAndroid Build Coastguard Workerif BPF.ksymname(syscall_fnname) != -1: 197*387f9dfdSAndroid Build Coastguard Worker b.attach_kprobe(event=syscall_fnname, fn_name="syscall__shmctl") 198*387f9dfdSAndroid Build Coastguard Worker b.attach_kretprobe(event=syscall_fnname, fn_name="trace_return") 199*387f9dfdSAndroid Build Coastguard Worker 200*387f9dfdSAndroid Build Coastguard WorkerTASK_COMM_LEN = 16 # linux/sched.h 201*387f9dfdSAndroid Build Coastguard Worker 202*387f9dfdSAndroid Build Coastguard WorkerSYS_SHMGET = 0 203*387f9dfdSAndroid Build Coastguard WorkerSYS_SHMAT = 1 204*387f9dfdSAndroid Build Coastguard WorkerSYS_SHMDT = 2 205*387f9dfdSAndroid Build Coastguard WorkerSYS_SHMCTL = 3 206*387f9dfdSAndroid Build Coastguard Worker 207*387f9dfdSAndroid Build Coastguard Workerinitial_ts = 0 208*387f9dfdSAndroid Build Coastguard Worker 209*387f9dfdSAndroid Build Coastguard Worker# header 210*387f9dfdSAndroid Build Coastguard Workerif args.timestamp: 211*387f9dfdSAndroid Build Coastguard Worker print("%-14s" % ("TIME(s)"), end="") 212*387f9dfdSAndroid Build Coastguard Workerprint("%-6s %-16s %6s %16s ARGs" % 213*387f9dfdSAndroid Build Coastguard Worker ("TID" if args.tid else "PID", "COMM", "SYS", "RET")) 214*387f9dfdSAndroid Build Coastguard Worker 215*387f9dfdSAndroid Build Coastguard Workerdef sys_name(sys): 216*387f9dfdSAndroid Build Coastguard Worker switcher = { 217*387f9dfdSAndroid Build Coastguard Worker SYS_SHMGET: "SHMGET", 218*387f9dfdSAndroid Build Coastguard Worker SYS_SHMAT: "SHMAT", 219*387f9dfdSAndroid Build Coastguard Worker SYS_SHMDT: "SHMDT", 220*387f9dfdSAndroid Build Coastguard Worker SYS_SHMCTL: "SHMCTL", 221*387f9dfdSAndroid Build Coastguard Worker } 222*387f9dfdSAndroid Build Coastguard Worker return switcher.get(sys, "N/A") 223*387f9dfdSAndroid Build Coastguard Worker 224*387f9dfdSAndroid Build Coastguard Workershmget_flags = [ 225*387f9dfdSAndroid Build Coastguard Worker { 'name' : 'IPC_CREAT', 'value' : 0o1000 }, 226*387f9dfdSAndroid Build Coastguard Worker { 'name' : 'IPC_EXCL', 'value' : 0o2000 }, 227*387f9dfdSAndroid Build Coastguard Worker { 'name' : 'SHM_HUGETLB', 'value' : 0o4000 }, 228*387f9dfdSAndroid Build Coastguard Worker { 'name' : 'SHM_HUGE_2MB', 'value' : 21 << 26 }, 229*387f9dfdSAndroid Build Coastguard Worker { 'name' : 'SHM_HUGE_1GB', 'value' : 30 << 26 }, 230*387f9dfdSAndroid Build Coastguard Worker { 'name' : 'SHM_NORESERVE', 'value' : 0o10000 }, 231*387f9dfdSAndroid Build Coastguard Worker { 'name' : 'SHM_EXEC', 'value' : 0o100000 } 232*387f9dfdSAndroid Build Coastguard Worker] 233*387f9dfdSAndroid Build Coastguard Worker 234*387f9dfdSAndroid Build Coastguard Workershmat_flags = [ 235*387f9dfdSAndroid Build Coastguard Worker { 'name' : 'SHM_RDONLY', 'value' : 0o10000 }, 236*387f9dfdSAndroid Build Coastguard Worker { 'name' : 'SHM_RND', 'value' : 0o20000 }, 237*387f9dfdSAndroid Build Coastguard Worker { 'name' : 'SHM_REMAP', 'value' : 0o40000 }, 238*387f9dfdSAndroid Build Coastguard Worker { 'name' : 'SHM_EXEC', 'value' : 0o100000 }, 239*387f9dfdSAndroid Build Coastguard Worker] 240*387f9dfdSAndroid Build Coastguard Worker 241*387f9dfdSAndroid Build Coastguard Workerdef shmflg_str(val, flags): 242*387f9dfdSAndroid Build Coastguard Worker cur = filter(lambda x : x['value'] & val, flags) 243*387f9dfdSAndroid Build Coastguard Worker str = "0x%x" % val 244*387f9dfdSAndroid Build Coastguard Worker 245*387f9dfdSAndroid Build Coastguard Worker if (not val): 246*387f9dfdSAndroid Build Coastguard Worker return str 247*387f9dfdSAndroid Build Coastguard Worker 248*387f9dfdSAndroid Build Coastguard Worker str += " (" 249*387f9dfdSAndroid Build Coastguard Worker cnt = 0 250*387f9dfdSAndroid Build Coastguard Worker for x in cur: 251*387f9dfdSAndroid Build Coastguard Worker if cnt: 252*387f9dfdSAndroid Build Coastguard Worker str += "|" 253*387f9dfdSAndroid Build Coastguard Worker str += x['name'] 254*387f9dfdSAndroid Build Coastguard Worker val &= ~x['value'] 255*387f9dfdSAndroid Build Coastguard Worker cnt += 1 256*387f9dfdSAndroid Build Coastguard Worker 257*387f9dfdSAndroid Build Coastguard Worker if val != 0 or not cnt: 258*387f9dfdSAndroid Build Coastguard Worker if cnt: 259*387f9dfdSAndroid Build Coastguard Worker str += "|" 260*387f9dfdSAndroid Build Coastguard Worker str += "0%o" % val 261*387f9dfdSAndroid Build Coastguard Worker 262*387f9dfdSAndroid Build Coastguard Worker str += ")" 263*387f9dfdSAndroid Build Coastguard Worker return str 264*387f9dfdSAndroid Build Coastguard Worker 265*387f9dfdSAndroid Build Coastguard Worker# process event 266*387f9dfdSAndroid Build Coastguard Workerdef print_event(cpu, data, size): 267*387f9dfdSAndroid Build Coastguard Worker event = b["events"].event(data) 268*387f9dfdSAndroid Build Coastguard Worker global initial_ts 269*387f9dfdSAndroid Build Coastguard Worker 270*387f9dfdSAndroid Build Coastguard Worker if not initial_ts: 271*387f9dfdSAndroid Build Coastguard Worker initial_ts = event.ts 272*387f9dfdSAndroid Build Coastguard Worker 273*387f9dfdSAndroid Build Coastguard Worker if args.name and bytes(args.name) not in event.comm: 274*387f9dfdSAndroid Build Coastguard Worker return 275*387f9dfdSAndroid Build Coastguard Worker 276*387f9dfdSAndroid Build Coastguard Worker if args.timestamp: 277*387f9dfdSAndroid Build Coastguard Worker delta = event.ts - initial_ts 278*387f9dfdSAndroid Build Coastguard Worker print("%-14.9f" % (float(delta) / 1000000), end="") 279*387f9dfdSAndroid Build Coastguard Worker 280*387f9dfdSAndroid Build Coastguard Worker print("%-6d %-16s %6s %16lx " % 281*387f9dfdSAndroid Build Coastguard Worker (event.id & 0xffffffff if args.tid else event.id >> 32, 282*387f9dfdSAndroid Build Coastguard Worker event.comm.decode(), sys_name(event.sys), event.ret), end = '') 283*387f9dfdSAndroid Build Coastguard Worker 284*387f9dfdSAndroid Build Coastguard Worker if event.sys == SYS_SHMGET: 285*387f9dfdSAndroid Build Coastguard Worker print("key: 0x%lx, size: %lu, shmflg: %s" % 286*387f9dfdSAndroid Build Coastguard Worker (event.key, event.size, shmflg_str(event.shmflg, shmget_flags))) 287*387f9dfdSAndroid Build Coastguard Worker 288*387f9dfdSAndroid Build Coastguard Worker if event.sys == SYS_SHMAT: 289*387f9dfdSAndroid Build Coastguard Worker print("shmid: 0x%lx, shmaddr: 0x%lx, shmflg: %s" % 290*387f9dfdSAndroid Build Coastguard Worker (event.shmid, event.shmaddr, shmflg_str(event.shmflg, shmat_flags))) 291*387f9dfdSAndroid Build Coastguard Worker 292*387f9dfdSAndroid Build Coastguard Worker if event.sys == SYS_SHMDT: 293*387f9dfdSAndroid Build Coastguard Worker print("shmaddr: 0x%lx" % (event.shmaddr)) 294*387f9dfdSAndroid Build Coastguard Worker 295*387f9dfdSAndroid Build Coastguard Worker if event.sys == SYS_SHMCTL: 296*387f9dfdSAndroid Build Coastguard Worker print("shmid: 0x%lx, cmd: %lu, buf: 0x%x" % (event.shmid, event.cmd, event.buf)) 297*387f9dfdSAndroid Build Coastguard Worker 298*387f9dfdSAndroid Build Coastguard Worker# loop with callback to print_event 299*387f9dfdSAndroid Build Coastguard Workerb["events"].open_perf_buffer(print_event, page_cnt=64) 300*387f9dfdSAndroid Build Coastguard Workerstart_time = datetime.now() 301*387f9dfdSAndroid Build Coastguard Workerwhile not args.duration or datetime.now() - start_time < args.duration: 302*387f9dfdSAndroid Build Coastguard Worker try: 303*387f9dfdSAndroid Build Coastguard Worker b.perf_buffer_poll(timeout=1000) 304*387f9dfdSAndroid Build Coastguard Worker except KeyboardInterrupt: 305*387f9dfdSAndroid Build Coastguard Worker exit() 306