"""Helper functions for gdbstub testing """ from __future__ import print_function import argparse import gdb import os import sys import traceback fail_count = 0 def gdb_exit(status): gdb.execute(f"exit {status}") class arg_parser(argparse.ArgumentParser): def exit(self, status=None, message=""): print("Wrong GDB script test argument! " + message) gdb_exit(1) def report(cond, msg): """Report success/fail of a test""" if cond: print("PASS: {}".format(msg)) else: print("FAIL: {}".format(msg)) global fail_count fail_count += 1 def main(test, expected_arch=None): """Run a test function This runs as the script it sourced (via -x, via run-test.py).""" try: inferior = gdb.selected_inferior() arch = inferior.architecture() print("ATTACHED: {}".format(arch.name())) if expected_arch is not None: report(arch.name() == expected_arch, "connected to {}".format(expected_arch)) except (gdb.error, AttributeError): print("SKIP: not connected") gdb_exit(0) if gdb.parse_and_eval("$pc") == 0: print("SKIP: PC not set") gdb_exit(0) try: test() except: print("GDB Exception:") traceback.print_exc(file=sys.stdout) global fail_count fail_count += 1 if "QEMU_TEST_INTERACTIVE" in os.environ: import code code.InteractiveConsole(locals=globals()).interact() raise try: gdb.execute("kill") except gdb.error: pass print("All tests complete: {} failures".format(fail_count)) gdb_exit(fail_count)