xref: /aosp_15_r20/external/bcc/tools/shmsnoop.py (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
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