forked from joelagnel/bcc
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request iovisor#133 from iovisor/bblanco_dev
Add bpf-run command line tool
- Loading branch information
Showing
4 changed files
with
92 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
# file GENERATED by distutils, do NOT edit | ||
setup.py | ||
bpf/__init__.py | ||
bpf-run |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
#!/usr/bin/env python | ||
|
||
import sys | ||
|
||
USAGE = """\ | ||
usage: {argv0} <opts> -p probe_func -c cmd | ||
-c cmd contents of the program to run, omitting prototype | ||
-d name dump table <name> upon exit | ||
-n sec run for <sec> seconds and then exit (default=-1) | ||
-p probe kernel entry point to trace (required) | ||
-t attach to kernel trace output | ||
-v increase verbosity | ||
example: | ||
{argv0} -p sys_clone -c 'bpf_trace_printk("hello\\n");' -t\ | ||
""" | ||
|
||
wrapper = """ | ||
int run(void *ctx) { | ||
%s | ||
return 0; | ||
} | ||
""" | ||
|
||
def print_usage_and_exit(rc, msg=None): | ||
if rc != 0: | ||
sys.stdout = sys.stderr | ||
if msg: | ||
print(msg) | ||
print(USAGE.format(argv0=sys.argv[0])) | ||
sys.exit(rc) | ||
|
||
def main(): | ||
import getopt | ||
import os | ||
import signal | ||
|
||
try: | ||
opts, args = getopt.getopt(sys.argv[1:], "c:d:hn:p:tv") | ||
except getopt.error, msg: | ||
print_usage_and_exit(2, msg) | ||
|
||
runcmd = None | ||
probe_fn = None | ||
trace = 0 | ||
dump_tables = [] | ||
verbose = 0 | ||
nsec = 0 | ||
|
||
for o, a in opts: | ||
if o == "-d": dump_tables.append(a) | ||
if o == "-n": nsec = int(a) | ||
if o == "-t": trace = 1 | ||
if o == "-v": verbose += 1 | ||
if o == "-c": runcmd = a | ||
if o == "-p": probe_fn = a | ||
if o == "-h": print_usage_and_exit(0) | ||
|
||
if not runcmd or not probe_fn: | ||
print_usage_and_exit(2, "Error: -p and -c arguments are required") | ||
|
||
from bpf import BPF | ||
|
||
b = BPF(text=wrapper % runcmd, debug=verbose) | ||
fn = b.load_func("run", BPF.KPROBE) | ||
BPF.attach_kprobe(fn, probe_fn) | ||
|
||
if nsec: | ||
def receive_alarm(signo, stack): | ||
os.kill(os.getpid(), signal.SIGINT) | ||
signal.signal(signal.SIGALRM, receive_alarm) | ||
signal.alarm(nsec) | ||
|
||
try: | ||
if trace: | ||
with open("/sys/kernel/debug/tracing/trace_pipe") as f: | ||
while True: | ||
line = f.readline(128) | ||
print(line.rstrip()) | ||
sys.stdout.flush() | ||
elif nsec: | ||
signal.pause() | ||
except KeyboardInterrupt: | ||
pass | ||
|
||
if dump_tables: | ||
print("Table dump not yet implemented") | ||
|
||
if __name__ == "__main__": | ||
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -14,4 +14,5 @@ setup(name='bpf', | |
author_email='[email protected]', | ||
url='http://plumgrid.com', | ||
packages=['bpf'], | ||
scripts=['bpf-run'], | ||
platforms=['Linux']) |