From 626b80f7f61b829523cd925d21d99e2d859f6333 Mon Sep 17 00:00:00 2001 From: Airtnp Date: Mon, 7 May 2018 23:33:31 -0400 Subject: [PATCH 1/7] Update README --- .gitignore | 5 +++++ README.md | 44 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index e7bad6b..0ff7bfb 100644 --- a/.gitignore +++ b/.gitignore @@ -105,3 +105,8 @@ venv.bak/ /.mypy-path/ /.direnv + +# generated data +perf.data + +.vscode/* \ No newline at end of file diff --git a/README.md b/README.md index d8cb97a..9de26cd 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,50 @@ # INSTALL +1. Setup virtualenv + +```console +$ virtualenv venv +$ . venv/bin/activate +``` + +2. Install project into virtualenv + ```console -$ pip install -r requirements_freeze.txt +$ pip install -e . ``` -Additionally pyqt5 is required and cannot be installed via pip. +Note: you may need to upgrade your pip >= 9.0.1 + +Additionally pyqt5 and radare2 is required and cannot be installed via pip. +(A guide for Python2.7 to install PyQt5 here https://github.com/pyqt/python-qt5/wiki/Compiling-PyQt5-on-Ubuntu-12.04) +(Must compile radare2 from github source code) + +3. Install test dependencies + +```console +$ pip install -e '.[test]' +``` -To update `requirements_freeze.txt` use: +4. Patch the perf-script-sample-addr ```console -$ pip freeze --exclude-editable > requirements_freeze.txt +git clone https://github.com/torvalds/linux +cd ./linux/tools/perf +cp path-to-your-hase-folder/perf-script-sample-addr.patch . +patch -p3 < perf-script-sample-addr.patch +make +sudo cp perf /usr/bin ``` + +Note: some new parse rules are applied recent days, so if you have intel_pt//u parse error, check this patch https://lkml.org/lkml/2018/5/7/94 and solve by git checkout an-eariler-commit-id + + +5. Testing examples + + +```console +# Since we need sudo, we have to install the packages in system +pip install -r requirements_freeze.txt +sudo nosetests -w tests/test_record.py +``` \ No newline at end of file From 0a9b278b2fd589b163180ee2916e860984b64684 Mon Sep 17 00:00:00 2001 From: Airtnp Date: Tue, 8 May 2018 23:31:02 -0400 Subject: [PATCH 2/7] Fix and Enhance frontend --- .gitignore | 4 +++- README.md | 2 ++ hase/frontend/__init__.py | 14 +++++++----- hase/frontend/ipython_extension.py | 34 +++++++++++++++++++++++------- tests/test_replay.py | 1 + 5 files changed, 41 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 0ff7bfb..fe5d864 100644 --- a/.gitignore +++ b/.gitignore @@ -108,5 +108,7 @@ venv.bak/ # generated data perf.data +perf.data.old -.vscode/* \ No newline at end of file +.vscode/* +auseless/ \ No newline at end of file diff --git a/README.md b/README.md index 9de26cd..7eec0d9 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,9 @@ $ pip install -e . Note: you may need to upgrade your pip >= 9.0.1 Additionally pyqt5 and radare2 is required and cannot be installed via pip. + (A guide for Python2.7 to install PyQt5 here https://github.com/pyqt/python-qt5/wiki/Compiling-PyQt5-on-Ubuntu-12.04) + (Must compile radare2 from github source code) 3. Install test dependencies diff --git a/hase/frontend/__init__.py b/hase/frontend/__init__.py index 1cfd7bd..d052404 100644 --- a/hase/frontend/__init__.py +++ b/hase/frontend/__init__.py @@ -11,6 +11,9 @@ from ..path import APP_ROOT +EXIT_REBOOT = -1 +EXIT_NORMAL = 0 + form_class, base_class = loadUiType(str(APP_ROOT.join('frontend', 'mainwindow.ui'))) # type: Tuple[Any, Any] @@ -44,12 +47,12 @@ def __init__(self, *args): def set_location(self, source_file, line): # type: (str, int) -> None lexer = pygments.lexers.get_lexer_for_filename(source_file) - html_formatter = pygments.formatters.get_formatter_by_name("html") - formatter = html_formatter(linenos="inline", linespans="line", hl_lines=[line]) - css = formatter.get_style_defs('.highlight') + formatter_opts = dict(linenos="inline", linespans="line", hl_lines=[line]) + html_formatter = pygments.formatters.get_formatter_by_name("html", **formatter_opts) + css = html_formatter.get_style_defs('.highlight') with open(source_file) as f: tokens = lexer.get_tokens(f.read()) - source = pygments.format(tokens, formatter) + source = pygments.format(tokens, html_formatter) self.code_view.setHtml(code_template.format(css, source)) self.code_view.scrollToAnchor("line-%d" % max(0, line - 10)) @@ -84,4 +87,5 @@ def start_window(): return app.exec_() def main(): - sys.exit(start_window()) + while start_window() == EXIT_REBOOT: + pass diff --git a/hase/frontend/ipython_extension.py b/hase/frontend/ipython_extension.py index 2fbebc6..68ad1d4 100644 --- a/hase/frontend/ipython_extension.py +++ b/hase/frontend/ipython_extension.py @@ -3,7 +3,7 @@ from IPython.core.magic import (magics_class, line_magic, Magics) from IPython import get_ipython from PyQt5 import QtWidgets -from . import MainWindow +from . import MainWindow, EXIT_REBOOT, EXIT_NORMAL import sys import os import imp @@ -13,6 +13,23 @@ from .. import gdb, annotate from ..replay import replay_trace +# only for function in Magics class +# FIXME: inherit documentation (maybe by functools.wraps) +# TODO: is there same way to get line_magic name instead of manually setting? +def args(*param_names, **kwargs): + def func_wrapper(func): + name = kwargs.pop('name', func.__name__) + def recv_args(inst, query): + param = shsplit(query) + if len(param) != len(param_names): + print("USAGE: {} {}".format(name, ''.join(param_names))) + return + func(inst, query) + recv_args.__name__ = func.__wrapped__.__name__ + recv_args.__doc__ = func.__wrapped__.__doc__ + return recv_args + return func_wrapper + @magics_class class HaseMagics(Magics): @@ -35,6 +52,12 @@ def window(self): # type: () -> MainWindow return self.user_ns["window"] + @args("", name="show") + @line_magic("show") + def show_source(self, query): + self.window.set_location(query, 0) + + @args() @line_magic("reload_hase") def reload_hase(self, query): module_path = os.path.dirname(__file__) @@ -47,15 +70,10 @@ def reload_hase(self, query): pass self.shell.extension_manager.reload_extension(__name__) + @args("") @line_magic("load") def load(self, query): - args = shsplit(query) - if len(args) < 1: - print("USAGE: load ") - return - executable, coredump, trace = args - states = replay_trace(executable, coredump, trace) - + states = replay_trace(query) user_ns = self.shell.user_ns addr2line = annotate.Addr2line() for s in states: diff --git a/tests/test_replay.py b/tests/test_replay.py index e27f136..6d0488d 100644 --- a/tests/test_replay.py +++ b/tests/test_replay.py @@ -1,3 +1,4 @@ +# FIXME: Inconsistent interface for replay from __future__ import absolute_import, division, print_function import nose From 0637334bf4cef9303c0a5ebef71941508e0a6e5f Mon Sep 17 00:00:00 2001 From: Airtnp Date: Wed, 9 May 2018 04:48:14 -0400 Subject: [PATCH 3/7] Add benchmark for Redis Add cli parser for single command (untested) --- .gitignore | 7 +- README.md | 6 +- hase/cli.py | 6 ++ hase/perf.py | 13 ++-- hase/record.py | 14 ++-- hase/util/__init__.py | 0 hase/util/sig_wrapper.py | 3 + tests/benchmark/__init__.py | 0 tests/benchmark/bench.py | 136 ++++++++++++++++++++++++++++++++++++ 9 files changed, 165 insertions(+), 20 deletions(-) create mode 100644 hase/util/__init__.py create mode 100644 hase/util/sig_wrapper.py create mode 100644 tests/benchmark/__init__.py create mode 100644 tests/benchmark/bench.py diff --git a/.gitignore b/.gitignore index fe5d864..ae53b72 100644 --- a/.gitignore +++ b/.gitignore @@ -107,8 +107,9 @@ venv.bak/ /.direnv # generated data -perf.data -perf.data.old +perf.data* .vscode/* -auseless/ \ No newline at end of file +auseless/ +*.rdb +tests/benchmark/bench_result diff --git a/README.md b/README.md index 91b398d..9f4b813 100644 --- a/README.md +++ b/README.md @@ -17,11 +17,7 @@ $ pip install -e . Note: you may need to upgrade your pip >= 9.0.1 -Additionally pyqt5 and radare2 is required and cannot be installed via pip. - -(A guide for Python2.7 to install PyQt5 here https://github.com/pyqt/python-qt5/wiki/Compiling-PyQt5-on-Ubuntu-12.04) - -(Must compile radare2 from github source code) +Additionally pyqt5 is required and cannot be installed via pip. 3. Install test dependencies diff --git a/hase/cli.py b/hase/cli.py index 7417d9e..f6d7903 100644 --- a/hase/cli.py +++ b/hase/cli.py @@ -39,6 +39,12 @@ def parse_arguments(argv): type=int, help="Maximum crashes to record (0 for unlimited crashes)") + record.add_argument( + "args", + nargs="*", + help="Executable and arguments for perf tracing" + ) + replay = subparsers.add_parser('replay') replay.add_argument("report") diff --git a/hase/perf.py b/hase/perf.py index 9acf038..ef8d061 100644 --- a/hase/perf.py +++ b/hase/perf.py @@ -10,7 +10,7 @@ class PTSnapshot(): - def __init__(self, perf_file="perf.data"): + def __init__(self, perf_file="perf.data", cmds=None): # type: (str) -> None cmd = [ @@ -27,12 +27,15 @@ def __init__(self, perf_file="perf.data"): "intel_pt//u", ] - dummy_process = [ - "sh", "-c", "echo ready; while true; do sleep 999999; done" - ] + if cmds: + cmds_process = cmds + else: + cmds_process = [ + "sh", "-c", "echo ready; while true; do sleep 999999; done" + ] self.perf_file = perf_file self.process = subprocess.Popen( - cmd + dummy_process, stdout=subprocess.PIPE) + cmd + cmds_process, stdout=subprocess.PIPE) line = self.process.stdout.readline().strip() assert line == "ready", "expected perf to return 'ready', got '%s'" % ( line) diff --git a/hase/record.py b/hase/record.py index 9a3436f..dd491a8 100644 --- a/hase/record.py +++ b/hase/record.py @@ -26,10 +26,10 @@ PROT_EXEC = 4 -def record(record_paths): - # type: (RecordPaths) -> Tuple[coredumps.Coredump, perf.PerfData] +def record(record_paths, cmds=None): + # type: (RecordPaths, List[Str]) -> Tuple[coredumps.Coredump, perf.PerfData] - with perf.PTSnapshot(perf_file=str(record_paths.perf)) as snapshot: + with perf.PTSnapshot(perf_file=str(record_paths.perf), cmds=cmds) as snapshot: handler = coredumps.Handler(snapshot.perf_pid, str(record_paths.coredump), str(record_paths.fifo), @@ -203,8 +203,8 @@ def report_worker(queue): job.remove() -def record_loop(record_path, log_path, pid_file=None, limit=0): - # type: (Path, Path, str, int) -> None +def record_loop(record_path, log_path, pid_file=None, limit=0, cmds=None): + # type: (Path, Path, str, int, List[Str]) -> None job_queue = Queue() # type: Queue post_process_thread = Thread(target=report_worker, args=(job_queue, )) @@ -216,7 +216,7 @@ def record_loop(record_path, log_path, pid_file=None, limit=0): i += 1 # TODO ratelimit record_paths = RecordPaths(record_path, i, log_path, pid_file) - (coredump, perf_data) = record(record_paths) + (coredump, perf_data) = record(record_paths, cmds) job_queue.put(Job(coredump, perf_data, record_paths)) except KeyboardInterrupt: pass @@ -235,4 +235,4 @@ def record_command(args): logging.basicConfig(filename=str(log_path.join("hase.log")), level=logging.INFO) with Tempdir() as tempdir: - record_loop(tempdir, log_path, pid_file=args.pid_file, limit=args.limit) + record_loop(tempdir, log_path, pid_file=args.pid_file, limit=args.limit, cmds=args.args) diff --git a/hase/util/__init__.py b/hase/util/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hase/util/sig_wrapper.py b/hase/util/sig_wrapper.py new file mode 100644 index 0000000..f53120f --- /dev/null +++ b/hase/util/sig_wrapper.py @@ -0,0 +1,3 @@ +import signal, os + +# tempref: https://docs.python.org/2/library/signal.html#example \ No newline at end of file diff --git a/tests/benchmark/__init__.py b/tests/benchmark/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/benchmark/bench.py b/tests/benchmark/bench.py new file mode 100644 index 0000000..b884f25 --- /dev/null +++ b/tests/benchmark/bench.py @@ -0,0 +1,136 @@ +import subprocess +import os +import pandas +import socket +import errno +import tempfile +from time import sleep + +from typing import IO + +perf_cmd = [ + "perf", + "record", + "-g", + "-e", + "cycles", + "-e", + "raw_syscalls:*/call-graph=no/", + "-e", + "sched:sched_switch/call-graph=no/", + "--switch-output", + "--overwrite", + "-a" +] + +server_cmd = [ + "redis-server", + "--port" +] + +def check_port_inuse(port): + # type: int -> bool + s = socket.socket() + try: + s.connect(("127.0.0.1", port)) + s.close() + return True + except socket.error: + return False + + +def bench_apache2(repeat = 3, n = 1000000): + # type: (int, int) -> pandas.DataFrame + + bench_cmd = [ + "ab", + "-n", + str(n), + "-c", + "100", + "-t", + "20", + ] + + + +def bench_redis(repeat = 3, n = 1000000): + # type: (int, int) -> pandas.DataFrame + + def read_result(file): + # type: IO[Any] -> pandas.DataFrame + df = pandas.read_csv(file, names=['Type', 'Req/s']) + return df + + bench_cmd = [ + "redis-benchmark", + "-r", + "100000", + "-n", + str(n), + "--csv", + "-p" + ] + + + df_allperf = None + df_allnoperf = None + + init_port = 10000 + + with open(os.devnull, 'w') as fnull: + for i in range(repeat): + + print("\nRunning the {}th benchmark\n".format(i + 1)) + print("Record performance without perf") + + while check_port_inuse(init_port): + init_port += 1 + + serv = subprocess.Popen(server_cmd + [str(init_port)], stdout=fnull) + sleep(1) # for setup + bench = subprocess.Popen(bench_cmd + [str(init_port)], stdout=subprocess.PIPE) + bench.wait() + serv.terminate() + if i == 0: + df_allnoperf = read_result(bench.stdout) + else: + df_allnoperf = pandas.concat([df_allnoperf, read_result(bench.stdout)['Req/s']], axis=1) + + print("Record performance with perf") + + while check_port_inuse(init_port): + init_port += 1 + + serv = subprocess.Popen(perf_cmd + server_cmd + [str(init_port)], stdout=fnull) + sleep(1) # for setup + bench = subprocess.Popen(bench_cmd + [str(init_port)], stdout=subprocess.PIPE) + bench.wait() + serv.terminate() + if i == 0: + df_allperf = read_result(bench.stdout) + else: + df_allperf = pandas.concat([df_allperf, read_result(bench.stdout)['Req/s']], axis=1) + + df_type = df_allnoperf['Type'] + df_avgperf = df_allperf['Req/s'].mean(axis=1) + df_avgnoperf = df_allnoperf['Req/s'].mean(axis=1) + df_alloverhead = df_allperf['Req/s'] / df_allnoperf['Req/s'] + df_overhead = df_alloverhead.mean(axis=1) + df_stddev = df_alloverhead.std(axis=1) + + print("\nTotal Repeat Time: {}".format(repeat)) + print("Repeat each instruction for {} times\n".format(n)) + + result = pandas.concat([ + df_type, + df_avgperf, + df_avgnoperf, + df_overhead, + df_stddev + ], axis = 1, keys=['Type', 'Avg Req/s w. perf', 'Avg Req/s w/o perf', '% of performance', 'Std. Dev']) + + print(result) + return result + +bench_redis(10) From 177cee907e81b3dd9b2883dc60cecb9906e042bf Mon Sep 17 00:00:00 2001 From: Airtnp Date: Wed, 9 May 2018 13:19:19 -0400 Subject: [PATCH 4/7] Update README --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 9f4b813..524df99 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ cp path-to-your-hase-folder/perf-script-sample-addr.patch . patch -p3 < perf-script-sample-addr.patch make sudo cp perf /usr/bin +``` Note: some new parse rules are applied recent days, so if you have intel_pt//u parse error, check this patch https://lkml.org/lkml/2018/5/7/94 and solve by git checkout an-eariler-commit-id @@ -62,3 +63,7 @@ $ ls -la /var/lib/hase .rw-r--r-- 4 root 9 May 3:22 hase-record.pid .rw-r--r-- 41M root 9 May 3:22 loopy-20180509T022227.tar.gz ``` + +```console +$ sudo ./bin/hase record ls -al +``` \ No newline at end of file From 8714312e8ca484a3baab751f5ca7d0297a94c71e Mon Sep 17 00:00:00 2001 From: Airtnp Date: Wed, 9 May 2018 21:26:05 -0400 Subject: [PATCH 5/7] Add run-by-single Fix addr2line --- .gitignore | 2 + hase/__init__.py | 1 - hase/annotate.py | 6 + hase/frontend/__init__.py | 21 +- hase/frontend/ipython_extension.py | 16 +- hase/perf.py | 19 +- hase/replay.py | 32 +-- hase/util/__init__.py | 1 + hase/util/sig_wrapper.py | 17 +- tests/benchmark/bench.py | 136 ---------- tests/benchmark/bench_result | 93 ------- tests/benchmark/record_syscall.py | 2 +- tests/bin/control_flow/control_flow | Bin 39704 -> 0 bytes .../control_flow-20180404T163033.coredump | Bin 180224 -> 0 bytes .../control_flow-20180404T163033.perf | Bin 35364 -> 0 bytes .../control_flow-20180404T163033.trace | 245 ------------------ 16 files changed, 74 insertions(+), 517 deletions(-) delete mode 100644 tests/benchmark/bench.py delete mode 100644 tests/benchmark/bench_result delete mode 100755 tests/bin/control_flow/control_flow delete mode 100644 tests/bin/control_flow/control_flow-20180404T163033.coredump delete mode 100644 tests/bin/control_flow/control_flow-20180404T163033.perf delete mode 100644 tests/bin/control_flow/control_flow-20180404T163033.trace diff --git a/.gitignore b/.gitignore index 483794a..ffab8e5 100644 --- a/.gitignore +++ b/.gitignore @@ -116,3 +116,5 @@ auseless/ # redis *.rdb tests/benchmark/results + +tests/bin/* \ No newline at end of file diff --git a/hase/__init__.py b/hase/__init__.py index ba4d802..2c4bc69 100644 --- a/hase/__init__.py +++ b/hase/__init__.py @@ -2,7 +2,6 @@ from .cli import parse_arguments import sys - def main(argv=sys.argv): args = parse_arguments(argv) if args.debug: diff --git a/hase/annotate.py b/hase/annotate.py index 3f0c89e..b6f09eb 100644 --- a/hase/annotate.py +++ b/hase/annotate.py @@ -42,5 +42,11 @@ def compute(self): for addr, line in zip(addresses, lines): file, line = line.split(":") + # TODO: file:line (discriminator n) + # TODO: file:? + print(file, line) + line = line.split(" ")[0] + if line == "?": + line = 0 addr_map[addr] = (file, int(line)) return addr_map diff --git a/hase/frontend/__init__.py b/hase/frontend/__init__.py index a37038e..a1a4811 100644 --- a/hase/frontend/__init__.py +++ b/hase/frontend/__init__.py @@ -46,15 +46,18 @@ def __init__(self, *args): def set_location(self, source_file, line): # type: (str, int) -> None - lexer = pygments.lexers.get_lexer_for_filename(source_file) - formatter_opts = dict(linenos="inline", linespans="line", hl_lines=[line]) - html_formatter = pygments.formatters.get_formatter_by_name("html", **formatter_opts) - css = html_formatter.get_style_defs('.highlight') - with open(source_file) as f: - tokens = lexer.get_tokens(f.read()) - source = pygments.format(tokens, html_formatter) - self.code_view.setHtml(code_template.format(css, source)) - self.code_view.scrollToAnchor("line-%d" % max(0, line - 10)) + # FIXME: how to robust deal with ?? + print(source_file, line) + if source_file != '??': + lexer = pygments.lexers.get_lexer_for_filename(source_file) + formatter_opts = dict(linenos="inline", linespans="line", hl_lines=[line]) + html_formatter = pygments.formatters.get_formatter_by_name("html", **formatter_opts) + css = html_formatter.get_style_defs('.highlight') + with open(source_file) as f: + tokens = lexer.get_tokens(f.read()) + source = pygments.format(tokens, html_formatter) + self.code_view.setHtml(code_template.format(css, source)) + self.code_view.scrollToAnchor("line-%d" % max(0, line - 10)) def setup_ipython(self, app, window): # type: (QtWidgets.QApplication, MainWindow) -> None diff --git a/hase/frontend/ipython_extension.py b/hase/frontend/ipython_extension.py index 639b85c..4c65dcc 100644 --- a/hase/frontend/ipython_extension.py +++ b/hase/frontend/ipython_extension.py @@ -12,6 +12,7 @@ from .. import gdb, annotate from ..replay import replay_trace +from ..path import Tempdir # only for function in Magics class # FIXME: inherit documentation (maybe by functools.wraps) @@ -73,13 +74,14 @@ def reload_hase(self, query): @args("") @line_magic("load") def load(self, query): - states = replay_trace(query) - user_ns = self.shell.user_ns - addr2line = annotate.Addr2line() - for s in states: - addr2line.add_addr(s.object(), s.address()) - - addr_map = addr2line.compute() + with Tempdir() as tempdir: + states = replay_trace(query, tempdir) + user_ns = self.shell.user_ns + addr2line = annotate.Addr2line() + for s in states: + addr2line.add_addr(s.object(), s.address()) + + addr_map = addr2line.compute() self.active_state = states[-1] user_ns["addr_map"] = addr_map user_ns["states"] = states diff --git a/hase/perf.py b/hase/perf.py index ef8d061..a0f2eb1 100644 --- a/hase/perf.py +++ b/hase/perf.py @@ -16,6 +16,7 @@ def __init__(self, perf_file="perf.data", cmds=None): cmd = [ "perf", "record", + "--no-buildid", "--no-buildid-cache", "--output", perf_file, @@ -27,21 +28,23 @@ def __init__(self, perf_file="perf.data", cmds=None): "intel_pt//u", ] - if cmds: - cmds_process = cmds - else: - cmds_process = [ - "sh", "-c", "echo ready; while true; do sleep 999999; done" - ] + self.test_cmds = cmds + + dummy_process = [ + "sh", "-c", "echo ready; while true; do sleep 999999; done" + ] self.perf_file = perf_file self.process = subprocess.Popen( - cmd + cmds_process, stdout=subprocess.PIPE) + cmd + dummy_process, stdout=subprocess.PIPE) line = self.process.stdout.readline().strip() assert line == "ready", "expected perf to return 'ready', got '%s'" % ( - line) + line) def get(self): # type: () -> PerfData + if self.test_cmds: + test_process = subprocess.Popen(self.test_cmds) + test_process.wait() self.process.wait() return PerfData(self.perf_file) diff --git a/hase/replay.py b/hase/replay.py index b1ca1b1..07e7ed3 100644 --- a/hase/replay.py +++ b/hase/replay.py @@ -34,27 +34,27 @@ def load_manifest(archive_root): return manifest +# FIXME: since ipython-addr2line needs binary to exist, add tempdir parameter? +def replay_trace(report, tempdir): + # type: (str, Tempdir) -> List[State] -def replay_trace(report): - # type: (str) -> List[State] + subprocess.check_call(["tar", "-xzf", report, "-C", str(tempdir)]) - with Tempdir() as tempdir: - subprocess.check_call(["tar", "-xzf", report, "-C", str(tempdir)]) - - manifest = load_manifest(tempdir) + manifest = load_manifest(tempdir) - coredump = manifest["coredump"] + coredump = manifest["coredump"] - t = Tracer( - coredump["executable"], - coredump["global_tid"], - manifest["perf_data"], - coredump["file"], - manifest["mappings"], - executable_root=str(tempdir.join("binaries"))) - return t.run() + t = Tracer( + coredump["executable"], + coredump["global_tid"], + manifest["perf_data"], + coredump["file"], + manifest["mappings"], + executable_root=str(tempdir.join("binaries"))) + return t.run() def replay_command(args): # type: (argparse.Namespace) -> List[State] - return replay_trace(args.report) + with Tempdir() as tempdir: + return replay_trace(args.report, tempdir) diff --git a/hase/util/__init__.py b/hase/util/__init__.py index e69de29..42f7b0b 100644 --- a/hase/util/__init__.py +++ b/hase/util/__init__.py @@ -0,0 +1 @@ +from __future__ import absolute_import, division, print_function diff --git a/hase/util/sig_wrapper.py b/hase/util/sig_wrapper.py index f53120f..459b7fa 100644 --- a/hase/util/sig_wrapper.py +++ b/hase/util/sig_wrapper.py @@ -1,3 +1,18 @@ import signal, os -# tempref: https://docs.python.org/2/library/signal.html#example \ No newline at end of file +from typing import Any + +class RegisterSig(): + def __init__(self, signum, handler = signal.SIG_IGN): + # type: (int, Any) -> () + self.signum = signum + self.handler = handler + self.original_handler = signal.getsignal(signum) + + def __enter__(self): + # type: () -> RegisterSig + signal.signal(self.signum, self.handler) + return self + + def __exit__(self, type, value, traceback): + signal.signal(self.signum, self.original_handler) \ No newline at end of file diff --git a/tests/benchmark/bench.py b/tests/benchmark/bench.py deleted file mode 100644 index b884f25..0000000 --- a/tests/benchmark/bench.py +++ /dev/null @@ -1,136 +0,0 @@ -import subprocess -import os -import pandas -import socket -import errno -import tempfile -from time import sleep - -from typing import IO - -perf_cmd = [ - "perf", - "record", - "-g", - "-e", - "cycles", - "-e", - "raw_syscalls:*/call-graph=no/", - "-e", - "sched:sched_switch/call-graph=no/", - "--switch-output", - "--overwrite", - "-a" -] - -server_cmd = [ - "redis-server", - "--port" -] - -def check_port_inuse(port): - # type: int -> bool - s = socket.socket() - try: - s.connect(("127.0.0.1", port)) - s.close() - return True - except socket.error: - return False - - -def bench_apache2(repeat = 3, n = 1000000): - # type: (int, int) -> pandas.DataFrame - - bench_cmd = [ - "ab", - "-n", - str(n), - "-c", - "100", - "-t", - "20", - ] - - - -def bench_redis(repeat = 3, n = 1000000): - # type: (int, int) -> pandas.DataFrame - - def read_result(file): - # type: IO[Any] -> pandas.DataFrame - df = pandas.read_csv(file, names=['Type', 'Req/s']) - return df - - bench_cmd = [ - "redis-benchmark", - "-r", - "100000", - "-n", - str(n), - "--csv", - "-p" - ] - - - df_allperf = None - df_allnoperf = None - - init_port = 10000 - - with open(os.devnull, 'w') as fnull: - for i in range(repeat): - - print("\nRunning the {}th benchmark\n".format(i + 1)) - print("Record performance without perf") - - while check_port_inuse(init_port): - init_port += 1 - - serv = subprocess.Popen(server_cmd + [str(init_port)], stdout=fnull) - sleep(1) # for setup - bench = subprocess.Popen(bench_cmd + [str(init_port)], stdout=subprocess.PIPE) - bench.wait() - serv.terminate() - if i == 0: - df_allnoperf = read_result(bench.stdout) - else: - df_allnoperf = pandas.concat([df_allnoperf, read_result(bench.stdout)['Req/s']], axis=1) - - print("Record performance with perf") - - while check_port_inuse(init_port): - init_port += 1 - - serv = subprocess.Popen(perf_cmd + server_cmd + [str(init_port)], stdout=fnull) - sleep(1) # for setup - bench = subprocess.Popen(bench_cmd + [str(init_port)], stdout=subprocess.PIPE) - bench.wait() - serv.terminate() - if i == 0: - df_allperf = read_result(bench.stdout) - else: - df_allperf = pandas.concat([df_allperf, read_result(bench.stdout)['Req/s']], axis=1) - - df_type = df_allnoperf['Type'] - df_avgperf = df_allperf['Req/s'].mean(axis=1) - df_avgnoperf = df_allnoperf['Req/s'].mean(axis=1) - df_alloverhead = df_allperf['Req/s'] / df_allnoperf['Req/s'] - df_overhead = df_alloverhead.mean(axis=1) - df_stddev = df_alloverhead.std(axis=1) - - print("\nTotal Repeat Time: {}".format(repeat)) - print("Repeat each instruction for {} times\n".format(n)) - - result = pandas.concat([ - df_type, - df_avgperf, - df_avgnoperf, - df_overhead, - df_stddev - ], axis = 1, keys=['Type', 'Avg Req/s w. perf', 'Avg Req/s w/o perf', '% of performance', 'Std. Dev']) - - print(result) - return result - -bench_redis(10) diff --git a/tests/benchmark/bench_result b/tests/benchmark/bench_result deleted file mode 100644 index 4e87577..0000000 --- a/tests/benchmark/bench_result +++ /dev/null @@ -1,93 +0,0 @@ - -Running the 1th benchmark - -Record performance without perf -Record performance with perf - -Running the 2th benchmark - -Record performance without perf -Record performance with perf - -Running the 3th benchmark - -Record performance without perf -Record performance with perf - -Running the 4th benchmark - -Record performance without perf -Record performance with perf - -Running the 5th benchmark - -Record performance without perf -Record performance with perf - -Running the 6th benchmark - -Record performance without perf -Record performance with perf - -Running the 7th benchmark - -Record performance without perf -Record performance with perf - -Running the 8th benchmark - -Record performance without perf -Record performance with perf - -Running the 9th benchmark - -Record performance without perf -Record performance with perf - -Running the 10th benchmark - -Record performance without perf -Record performance with perf - -Total Repeat Time: 10 -Repeat each instruction for 1000000 times - - Type Avg Req/s w. perf Avg Req/s w/o perf \ -0 PING_INLINE 71196.771111 108032.542 -1 PING_BULK 74666.482222 128509.318 -2 SET 76150.034444 129602.720 -3 GET 73967.368889 130419.192 -4 INCR 75525.465556 130309.932 -5 LPUSH 75311.471111 133960.813 -6 RPUSH 75259.726667 133334.489 -7 LPOP 73591.257778 132886.089 -8 RPOP 69206.561111 131397.699 -9 SADD 69542.231111 133180.010 -10 HSET 70607.655556 120611.741 -11 SPOP 67240.771111 131927.096 -12 LPUSH (needed to benchmark LRANGE) 66356.200000 136325.103 -13 LRANGE_100 (first 100 elements) 43844.437778 67510.601 -14 LRANGE_300 (first 300 elements) 21121.450000 26061.175 -15 LRANGE_500 (first 450 elements) 15771.912222 18587.644 -16 LRANGE_600 (first 600 elements) 12891.764444 14645.199 -17 MSET (10 keys) 65336.393333 92072.625 - - % of performance Std. Dev -0 0.654403 0.114807 -1 0.582374 0.022161 -2 0.594408 0.052648 -3 0.569631 0.035122 -4 0.583803 0.049517 -5 0.563146 0.034922 -6 0.565590 0.017587 -7 0.555122 0.037983 -8 0.525093 0.058341 -9 0.521789 0.068162 -10 0.584471 0.109645 -11 0.508072 0.078152 -12 0.486294 0.093153 -13 0.635455 0.100385 -14 0.796134 0.074166 -15 0.834507 0.090475 -16 0.863542 0.056649 -17 0.709535 0.164405 diff --git a/tests/benchmark/record_syscall.py b/tests/benchmark/record_syscall.py index f4cc430..6ccb214 100644 --- a/tests/benchmark/record_syscall.py +++ b/tests/benchmark/record_syscall.py @@ -45,7 +45,7 @@ def bench_redis(repeat=3, n=1000000): # type: (int, int) -> pandas.DataFrame def read_result(name, file): - # type: (Optional[IO[Any]]) -> pandas.DataFrame + # type: (Str, Optional[IO[Any]]) -> pandas.DataFrame df = pandas.read_csv(file, names=['Type', 'Req/s']) df["Name"] = name return df diff --git a/tests/bin/control_flow/control_flow b/tests/bin/control_flow/control_flow deleted file mode 100755 index 5c567fb2ac2f8069bb94e890bc20fbddf0a6f8ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39704 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

Iy&}*+1978^ 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 Yqd%{#w9i82Z@x>Fe^xy*cW?Rs1w$L!x&QzG diff --git a/tests/bin/control_flow/control_flow-20180404T163033.coredump b/tests/bin/control_flow/control_flow-20180404T163033.coredump deleted file mode 100644 index 23c53e483606ab69824629fcd453176975441836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180224 zcmeI54V)ZRmFTNyGRY7!baV-z=w^T*ENstI^=Gv(IzwiX8kl^%Oa_A*C)HK`QQcKF z-BsOP-K`6WlX2ji+yN!$fqpI1wrv%Gvk0&CNgdi8ITwZXHxMl(X+|7p?cMGs|_l<)~~f_XW2c zv#m}pS9^|^t55lnwl=~|lKWh}VbcK7w>gmjT#aFfwv)6!S;sJMgx7OJ4D*>@lCtnM z-MVo4Z%f_o>9tj+?j5)9J^PQ2q~+GQw`g|;5+kJZaPf|qeP6P)cQ#A{v>r<69588TKjpT2rJH{H@@;PDwF$Rdw!PjAMFC^A?A~x9z@JK&spDv;u=yc`-HRJlJqYsiS+GlFlZ*cWxS5i~# zWqR!t>VK%skT%IhCG}HIs%!W(0`e?3+|tr(hnn5hGB=-!4jOPJwLO}AJ`K3?O|G2T z?b!aCoAOt>@%x^0^1W{SC0D;m-M+8;A#q@6a1CWj=K*B~)SY6>UFpQ&eVY^Nbfpt} zeYW^IOWWfFH$d)z-p@^Rklp@Kv7N%A2`K+d5+FXH7bbQK7{$=w`jIV-cX{<)Kf2}P z4bMY2?}EhoDe|1$60O~K;V0_#?1m#pKMHzZxb~@U?*iF-^6oqS#{%VO)!AFK-zD{W zp1sg^QPi){d@A`Z_gz5h+y35ntXZfZMDOCre)`C;pU1xr|6LF3Rv>mi@x)b8@!uNr>?*G z8%I8Q`x~!*q3y5CCD$5%|EIU_EiS#{AKvn@CHEeGc_O;?Q+}rJeP280{8N8-@wuyh z(ewFJ-?}mS@byFIztqKC-1p4#Q_JuA@?QrMKUwkT6PMlbp+h};POa#E=7DP4t^Yic z{PlEl;4>S~@(vuXzjW(~uFWTQRQ~>O_tC?TOUpj_w)&CBUixIF<2qx*-fu0QUh&wE zw{7m+_3b+j{=*;JRGu{mYDg%N01`j~|H%YyYTEy|xcmQ>mR`GO&O5_w`IsGb(|A~i z_A=))=h@FUy4H3yXbDH&ztl;kl3_aS1mX|L)9wj(!TW@Fo1IQ2eO^wJg`s_Q+VB7E z*}Odalyov)^_}i7HbFV^On;^JE_Z98lKSiID;C8Wn)s?MIhpOQ&c-eK?9ebbRXsI* zJv2Qn!W%a=eJzOUlhe<@v){Xt5ypRZ!LI5DRxR7LYges*)v}&C6uZ#_F*`bb@~oTQ z>|NQ*II$^D6?ACMjXwpg1CT&kB87?eg$eJ_|rVB*Qx%DOTf^CNH88aN_MRI$IvJ*L{)kY0cKSwG0q$>G3n`wh z`|Ng(gXm=vU9S5S>eDGPj0xnyx^TV0Gi&F+wD89?hz*YJi_?Zdzr$ogvmvZ5la+2hlJX4q1yJ% zb2=Ge;;?t;J*4vSsdm~QVf^JwEuh^lREPeh6LOXdwT&l1weYM^yLHvwq>|c)S9OwN zFs>Vgi5G?Hit9;r)s81^(RMco@6HyYa$xFm(z^qDS-X?0Q1yH7UA%KD|7Kx)zX$B^ z>h1#Y_S><0*VK1T6@CskHXVl{6>9gdnuhkKp8#VKYCBhLCyht@SC#VRg!j3r!Rk{2 zSf4$^c9WGXiIC~~02F4p!%&a+&latM)OP3!<82crdtLxv@c_~3d$Iq};?6vS z$sd^!AwD;zLhZ||E+8Z(Ui41<{4}T@*lQ!1Y%`!QLbYWUPRmRS6m`dMH<<)8Lr}o6 zQ*MfTc;=%dI%`UHe@BMN44LluHK})qT^u zY$LkW9w%7{oNHH8SO&vMs;@o)Fs2^`W0)h7*flIv-zk8{ybH=sOqF^IOAoZ&dbVo^ zlkewuf7foQx|$az+a81rp*l_)7beF)O+?iea8s^-*$v?8cEp+Qgg5YYG1c1M3snr& zF5OCMs=aj$5tBQYOv6AAp7`G2MGpxR|C;X>CdXicZio6|*8fDf^8J?!wc+K$_*Y@T z{^F!iGux-{hx-s}7lL}>dqS;k1ynRx9bnc~KeuW*nBP$KsdZI#Rl8#Yeedm~{>vHY z4VMqqHe4V~JnY?h9nr3>?HsBeH@F!1R)5jcE0BkVKQ4En!LH2^y9>Lg^PYAjGtU0Oa_+<)zDHXYn=zB z+aS;mt@V9{9O&8;39?Tu0nnbWLtVc-3#uId@kwa*G$aZ;PTx)HtA-9iM)9J)`!0sU z@US5x2Tz&ZXF-&!-v zBefOpwnbY8#0&>jJ6wUyaN!E@0lVM0jS-Z++WP%{;1s~>&%G2Hgl=7PIhfDvoQ0WX zYgSL+NA6L8C;1*CYpqAWM%sJ6LDz0ys_*^@D0tiMyBfqUp?b*McJw7^+_6VtN1ZuV zuUm_R>dAdz{HLbLysAEV;>jux-kUIJY#z$L+~>4B8JYsk-Q)n0t9#qr`)|xAvuu9; zX{WrM@gQ-<++ipU&4b%*H_knAfVlGfvU`O3BTl&Ryik2y*fZ05T=>-Z(@XMg_tYOL zoPrXkA8Y~VzxyuGpKafE7mz?6YW@4@DhSTI<#@4MFQ_WXgA4BKCh(cF*SStI%Z5sL^w<~f|8f6suTF9QziKioX{jdSlCUcGW8i2k^$#f8{q@v^Wsv|9Kmter2_OL^fCP{L5sh>LfAc@Q5 z?R8u;Zhfz{ipagc_|j)nr!J!Ulq2PP%F|1;Y)SH$LWt(y+jeID8OjSpgqAb)FL2|u zzAZ-_9=Eyjc30lv$~#?omn&%#cf0Ym-*(Dxab?_1{(uKboO&;E{+ zf1WGf=E}3a@1#HA%12%Klq+9w<%K_R^a8HD%9Yo-vgXR$U72~#(Z9)+pKv9;zu5um zyvw$KYJSviC_l!{c!OJz+Ec3=r}n(ajW^phweKagVOQG5+K_gZ8>aStc0(QsE^CT+ zG{w(pil5&Uf0G-h_Wb6i{FQF}K9`f%jnnzmq&^p=2H%$b@YT#q=k%8N@Mt(VmyaPN zfCP{L5Y6i_J;CYETo3~L4ytDDoM-aGyY;E!Dd5#g)Im5T-Z03jq9eV+BNv~=Hh|0 z#OWE)P_xBgCMt7Q#9!tU;Zixwr()4u(3dUeQ)9Z%-xcZNg1)$3Y_37{N6fTXOhjT9 zS5Yc*vSO68*`gultWqXpDL&|MBBA&KUHsSB5s_>x@WlOZk5iaD*AmeQH1pOyX5gyh$(1*Af%*K zwy0!$NjauLQ7+irY$~QoiY8jYO1W$VN)}rxri)^j)wE1ez?g3?$+5h` zl}xLY)QU#MFpZKw65*r%WY!8RrBJ|EfgVGfU|aL1hN*DLFwa&ZCCSJ}xTK%wB4#ia zV=caz3du>Z?Q9v^w3ELTDIFXQ@&($-P+BoM*?EJTTI6Fd{;0U zbo%S`b@RLX2RHR}$MaHmWlWDNdSZ-OKe)y5Mc|6EnWX9Xq@rlpz9nmnB@{Joc7qN1 z3MLp5x#?~xCF*)yHHprc{Z5L$-H!Rd5hj$R(~Ohvq!bJ>uZ-zkkmfk9*VqWN@m;S# z_EkJEBW!>XvU}?c5gD}}+k-Rcg3$$o5xNgvbiuFD1qV~CsH$eg&zGVa__RtaXca@8 zs3t|JR52pHB)DLSJYK^-E-=pv|6V=#=7CM?2G_6IFbWQD*l|VkU753VLk89ng)uiS6Dd#D} zGVA&VhkEQ5G*M9>JgxoY8QNF{rWI{{@Lu#=S(RAH3VnJV0lIZ%+7lBn3+uXRMg(`Y1RV=GUD#H3xDYG0+ z>7pF5GJ#^GRJ3bYuw=R%R+0%TQW7l{N@XI6h?Lfod`f2JoSaQG`2s?|x$&G)G9#uK zOXVaZkdBH9n`WhKh_57cz09U7wuLyu#drDVfqQ*}J?H)t6)=~C9){&$P~-gxBc;Y7 zye_c;y&SMYp*f>zG?uyY|M?_RilhYfL{_P=*$gaD)3J205-TOtWK=GexuQ>xj};ZI znLn(bOOb??Rt*+b-Z429V+|!B^W~JBiNcQ2N8AQXHQ4%b^XUH$W~-)DikVcb$ilP3 zWV59TtBD!Y5{;}Dh;n@Fj8%ElOgH#|k&?7PhA&mZGR&KDQIqt9q3}ty6wO5JvSdN; zD=J350PaaI`iRe%KL?U}Sq|tdmxyt&Nt8HQmbsFY&85VW8I9z?@4)83uF8z(3)%eG z82FC>-vvIXnP|l-Yob>6M}o3nk@#HJ)cu-~2!!;AEGeZl*;K){)DLba+7SoFeM(r9*HBYu@T><|>oyY{rQZi8FGevNvhMBN9lM6*vI2VAeu;C9jSFu1ZOvA{P zlF5o%f*QC|S_>DWS&o$hDZa=XCB-MfSd+~(Y`NyS@nX!7*&vKWG*FCb;ASF~Vmc9m z4K6rJaH|bx0o+3UH+d<}unLM2)9t6*8OrD&$EMS_N^#~RBw4?sBWx72hx;LqmZ z!DA))OwcID{IR4G1qQ{6&xngMJcQzK5E00-d~sk$8)f*ip3H#m*o_ZkFljp zh1B57s)eMYo8*}nf2E2zDV3GO85s^3vzC$wrn5yWm(D2`4_kv^%<|>(@VMl=BF*<; zCd5oJTb5ILT8(9tT*b_AFg>_Xg{>s~N!FKyL%LK^sSu3hXt&8N;8KU~)w7Z;>ZycP zQcAjJ`7J}y;Bl?$p<)7zgsb>;(Im#m!D81wVryKd7sFC69ZiQ4X}_9P(-FTV71L@( zt%Pz`Pz&ikLzH1FNFL9@`Rjy~p;V$u*yN*$idjtSTDTGpmPK;hTS`>IVV_oj!*y74 zH;-O8oQP-NX!pSf3O+SqLbCx_Y%MT_Ugt_Vpp?Xr zq=zD~LkVULo)cL^&cu|UEUJ+pFZvRSE;|ctcqYxi^DJNTn;|I`WXt84kx@et)5->6 zwP^Zdx|mUXvXV$R)fErvz-L?l+>f?9%4 zB=mG98}=vol$Z+?WnWUXGSDd4N^?;|PqIe9N@*&W&Z(Rk&YB!_Bf*2a(M1;aRj`W` z4e(cic{?i2u;A9p5x*P|V_}Jh19>i~nN~>6zyeSQX9J(&K*@Ov>feRS&s9QdELyTk zW%ww=427eH7%8#}Cz`QLFv)>+!t#NvyB56d90#|p!uCt6M2tX$OJqaYpg$WFC9UX> zM&wuB52V6TO^f+ql^a#dnIISTTVlkYWz&*oaiIvTqRAc@Ogu8*LUO6FUsSRo(Sm*^ z&0x8bwzBZ?k(CAe^uvb&r3xI*!|a%w8x4DP+gCQkyCl&_jyYr6kW7=vF^2n@i2bqM zE1&n+6)$}10a@fcW%D2$F*ly2Y#i9MX7rko!J+=aesc2UoIiJW$?;er$y__QxqoEc zM)*|0IaaaD4{z>Ux3Py~8jqd+{hu(t%14)&g#?fQ5C(%(DU_-tM#Vbv|yEU7+~ zv>fRk`Q0lLC*j%OTY@nCtt5h~kpsCm+Fw$J5Q}SD{<02g3tpt1i{V$7zCbz&SDVZ8 zJP5xL(x==XVA?|(gzK&FBKpngS3o+^-{tnH7zs|Q|o|C`d8(b1x8j*Uw2T_Ks#WIUf&v^Y(4qhs**zGa%$lrLoqjPunW zq?#`HAO2!y?mHNgmYB&E(@8B>QQ_~+MYd8(N3D=#z+Ziav|JYcytMIaL*S21!@eAl_b8?;WCgII)0=4T-*B)LtT^}P^+uS&v%eNCFhKt(!r`>$l%$V;v*$n;t zuM6Dxuj@{IH@kND8#nG&$NZ_QN8`ub{Jg90W}`p?NZ=2U0PzRZhYS%P3Grp#MRpqT zO=KFcT|dIS=ce_4RX*>Q%dWj4qTcrL_=TVRTE}gk3tO)uzdK0k*a`lG_@pm``~b*) za0vH++zbxrd628%!PpOZ{UBwKq;7I~Dw`NjX}RaZWlP$3LHa64Bfj!-2wy@J`p#MY zp_bJhi*H!EA5{9z?kB?0>xXQzo~X|1ZR}XwqPdELw&D=vsqnfT^z3Kpz_O*x(DKDC zMdmthYjNA+<>#~%OUpZ2irMAMT8gQG<*hBnEiLPp?z`p@(7fi+YaYAi>wWwC?Y5yF zQs4dX+5*t*XE3R6@VD0Y_$$>%?sXaT?FryyKcnsYUDvUAjdPzQ|Igig`x$HJ3muEM zIr$?(^;z%dr@fr8=jl%2tV2R=#g6^;x)9xKwQSudR1a<4=UvGpy1XlQLQM=aQtSB6 zHz9vA^c)e@XUBhdy03ch#l@by)L4)AffbJtg)7^>1fu%*V0F)l?+hN9sXi_od1~Tt zZN+CHdC)8D5l%cUct3Zj6B^zHNwtm&y!S;97XDW791@~!$G-}-cvrU_1-W$}H+8^X zWszQOC;b_k+`Ot?82{0+zUryIx^a@+Pv7-@BYm6uHVsW`j}8lyZ~Zi>V*FCi${od^*jh2v_sdoU)5UpJ~t(dKXk!+ z`rh65-oCAU@7p>!89TY}_%2eia1wNP&X)S%Y^nSsN1r^ttG{+h--{1<3NO^!E`hA- zz@tK~ZNOGqTx(knfuY)p9uVUvJ>H#{kj|ZK@$Ot}2U@*5?}R|Dg8_y9=p}_O4pk2c zN2Z0I`oniz<^9k;=skB>@G+0van<-wLP8ZfI0gae;7$3W?zJTnMkp<0-lPQwyGs1>HbbWZF8gIM7qUAd&~R}c}r z|99`8XYbJu+nT*|nvdC<-zF-Tv>lw&oY@Pt4^^K#L;vX4X-bz{!_ixW$sW%$_4?5Z zhiV}P0z$2W#BG!AuXzWe2lJKw+LD2ZslxXU3_J?A&2UpQTS%uTdk#G9mfQ~kC`sat zC0ETaDL~2NyJkKJ9RN{)Ub+)-@WhW{)(M`2!uZL$ccK&Yjvib%@4HZHW(*W|&CSob z`Oq{OhRF;NChFduyP@wxlb7DI7s!AS48p{zy=B#l`(O%0Y%BNx0ouZ9ZYrS5l|EM{Ipg0$~R67Kl7=NKh#NJocJN6Eh0Kl#l(x= ziQ9<3{54xDC|W z`=j5;zpJmtPt*%Pm>uw=pP`oX{L4-&M{fr+;GMzzM;MRViaVg4>Up&lw-I^$qM6N* zxqBOQc&Pd$%)SALEH|V~P zoGXyJX?ePTr1E=^*LaaS8m~(s0_HN?f4U!}lCJ+~|7kl^`k_2nx6KF2~3Aa4kq({#! z8;(D14O+fYHVv_@cctspyTZ#0ha*G{}7x-;qxCY0tp}iB!C2vz#kETe*+Uopj!X{ diff --git a/tests/bin/control_flow/control_flow-20180404T163033.perf b/tests/bin/control_flow/control_flow-20180404T163033.perf deleted file mode 100644 index b09f8a13cace44526c28d3f109df251744db68f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35364 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 diff --git a/tests/bin/control_flow/control_flow-20180404T163033.trace b/tests/bin/control_flow/control_flow-20180404T163033.trace deleted file mode 100644 index 4ef7a8e..0000000 --- a/tests/bin/control_flow/control_flow-20180404T163033.trace +++ /dev/null @@ -1,245 +0,0 @@ -0 400202 -400202 0 -0 400202 -400213 400220 -400243 400580 -4005a1 400320 -40034a 40035b -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -400364 400358 -4003a9 400390 -4003a9 400390 -4003a9 400390 -4003a9 400390 -4003a9 400390 -4003a9 400390 -4003a9 400390 -4003a9 400390 -4003a9 400390 -4003a9 400390 -4003a9 400390 -4003a9 400390 -4003a9 400390 -4003a9 400390 -4003a9 400390 -4003a9 400390 -4003a9 400390 -4003a9 400390 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400411 400400 -400402 400407 -400416 400780 -4007a0 4007cd -4007d2 4007a8 -4007ab 4008d0 -4008d7 4007c4 -4007d2 4007a8 -4007ab 4008d0 -4008d7 4007c4 -4007d2 4007a8 -4007ab 4008d0 -4008d7 4007c4 -4007d2 4007a8 -4007ab 4008d0 -4008d7 4007c4 -4007d2 4007a8 -4007ab 4008d0 -4008d7 4007c4 -4007cb 4007e4 -4007e7 4008e0 -4008f5 40082b -400890 4008b3 -4008b3 4006f0 -400723 400754 -400779 4008b8 -4008bb 400690 -400697 400a3a -400a47 0 -0 400a49 -400a49 40069c -4006b5 0 -0 4006b7 -4006d9 4008c0 -4008c2 4008c5 -4008c9 40041b -400423 400900 -400904 400930 -400942 400a08 -400a17 400a25 -400a32 400a39 -400a39 400947 -40094a 400917 -400925 400428 -400435 4004b0 -4004cf 4004a4 -4004ab 4005a6 -4005a6 400540 -400546 400158 -40015a 40054b -400560 0 -0 400560 -400560 4002f0 -4002f5 400280 -4002a1 4002b8 -4002b9 400562 -400571 4005ab -4005b3 400180 -400195 400198 -4001bc 4001a8 -4001bc 4001a8 -4001bc 4001a8 -4001eb 4001d8 -4001eb 4001d8 -4001eb 4001d8 -4001eb 4001d8 -4001eb 4001d8 -4001eb 4001d8 -4001eb 4001d8 -4001eb 4001d8 -4001eb 4001d8 -4001f5 400610 -400634 4009d0 -4009e7 0 -0 4009e9 -4009e9 400639 -40063e 0 -0 400640 -40064b 0 -0 40064d -400650 400980 -40098c 400655 -40065b 4009f0 -400a05 0 From 795099929d8653227d7ed69b635ba5e5d21bf9b4 Mon Sep 17 00:00:00 2001 From: Airtnp Date: Thu, 10 May 2018 09:30:13 -0400 Subject: [PATCH 6/7] Fix type sigature (using mypy --no-strict-optional now) --- hase/path.py | 4 ++-- hase/perf.py | 11 ++++++----- hase/record.py | 6 +++--- hase/symbex/state.py | 4 ++-- hase/util/sig_wrapper.py | 2 +- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/hase/path.py b/hase/path.py index 5c14f88..8613795 100644 --- a/hase/path.py +++ b/hase/path.py @@ -5,11 +5,11 @@ import errno import shutil -from typing import Union, AnyStr +from typing import Union, AnyStr, Optional def which(program): - # type: (str) -> Path + # type: (str) -> Optional[Path] def is_exe(fpath): return os.path.isfile(fpath) and os.access(fpath, os.X_OK) diff --git a/hase/perf.py b/hase/perf.py index a0f2eb1..a0a7d08 100644 --- a/hase/perf.py +++ b/hase/perf.py @@ -2,7 +2,7 @@ import subprocess import os -from typing import List, Tuple, Any, Union, Callable +from typing import List, Tuple, Any, Union, Callable, Optional from .path import APP_ROOT @@ -11,7 +11,7 @@ class PTSnapshot(): def __init__(self, perf_file="perf.data", cmds=None): - # type: (str) -> None + # type: (str, Optional[List[str]]) -> None cmd = [ "perf", @@ -36,9 +36,10 @@ def __init__(self, perf_file="perf.data", cmds=None): self.perf_file = perf_file self.process = subprocess.Popen( cmd + dummy_process, stdout=subprocess.PIPE) - line = self.process.stdout.readline().strip() - assert line == "ready", "expected perf to return 'ready', got '%s'" % ( - line) + if self.process.stdout: + line = self.process.stdout.readline().strip() + assert line == "ready", "expected perf to return 'ready', got '%s'" % ( + line) def get(self): # type: () -> PerfData diff --git a/hase/record.py b/hase/record.py index dd491a8..381994a 100644 --- a/hase/record.py +++ b/hase/record.py @@ -17,7 +17,7 @@ from . import pwn_wrapper -from typing import Optional, IO, Any, Tuple +from typing import Optional, IO, Any, Tuple, List l = logging.getLogger(__name__) @@ -27,7 +27,7 @@ def record(record_paths, cmds=None): - # type: (RecordPaths, List[Str]) -> Tuple[coredumps.Coredump, perf.PerfData] + # type: (RecordPaths, List[str]) -> Tuple[coredumps.Coredump, perf.PerfData] with perf.PTSnapshot(perf_file=str(record_paths.perf), cmds=cmds) as snapshot: handler = coredumps.Handler(snapshot.perf_pid, @@ -204,7 +204,7 @@ def report_worker(queue): def record_loop(record_path, log_path, pid_file=None, limit=0, cmds=None): - # type: (Path, Path, str, int, List[Str]) -> None + # type: (Path, Path, str, int, List[str]) -> None job_queue = Queue() # type: Queue post_process_thread = Thread(target=report_worker, args=(job_queue, )) diff --git a/hase/symbex/state.py b/hase/symbex/state.py index cf39060..cc9f4f8 100644 --- a/hase/symbex/state.py +++ b/hase/symbex/state.py @@ -1,7 +1,7 @@ from __future__ import absolute_import, division, print_function from angr import SimState from cle import ELF -from typing import Dict, Tuple +from typing import Dict, Tuple, Optional from ..perf import TRACE_END, Branch from ..annotate import Addr2line @@ -33,7 +33,7 @@ def __init__(self, state): self.state = state def __getitem__(self, addr): - # type: (int) -> int + # type: (int) -> Optional[int] # good idea? byte = self.state.simstate.mem[addr].byte try: diff --git a/hase/util/sig_wrapper.py b/hase/util/sig_wrapper.py index 459b7fa..04095bf 100644 --- a/hase/util/sig_wrapper.py +++ b/hase/util/sig_wrapper.py @@ -4,7 +4,7 @@ class RegisterSig(): def __init__(self, signum, handler = signal.SIG_IGN): - # type: (int, Any) -> () + # type: (int, Any) -> None self.signum = signum self.handler = handler self.original_handler = signal.getsignal(signum) From a8be8b1e63be6758ddf67ef7c6c62d8eea6046a9 Mon Sep 17 00:00:00 2001 From: Airtnp Date: Thu, 10 May 2018 09:43:41 -0400 Subject: [PATCH 7/7] Fix README --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 2fd059a..2a17673 100644 --- a/README.md +++ b/README.md @@ -43,8 +43,6 @@ Note: some new parse rules are applied recent days, so if you have intel_pt//u p ```console -# Since we need sudo, we have to install the packages in system -pip install -r requirements_freeze.txt sudo nosetests -w tests/test_record.py ```