qemu/tests/guest-debug/test_gdbstub.py
<<
>>
Prefs
   1"""Helper functions for gdbstub testing
   2
   3"""
   4from __future__ import print_function
   5import argparse
   6import gdb
   7import os
   8import sys
   9import traceback
  10
  11fail_count = 0
  12
  13
  14def gdb_exit(status):
  15    gdb.execute(f"exit {status}")
  16
  17
  18class arg_parser(argparse.ArgumentParser):
  19    def exit(self, status=None, message=""):
  20        print("Wrong GDB script test argument! " + message)
  21        gdb_exit(1)
  22
  23
  24def report(cond, msg):
  25    """Report success/fail of a test"""
  26    if cond:
  27        print("PASS: {}".format(msg))
  28    else:
  29        print("FAIL: {}".format(msg))
  30        global fail_count
  31        fail_count += 1
  32
  33
  34def main(test, expected_arch=None):
  35    """Run a test function
  36
  37    This runs as the script it sourced (via -x, via run-test.py)."""
  38    try:
  39        inferior = gdb.selected_inferior()
  40        arch = inferior.architecture()
  41        print("ATTACHED: {}".format(arch.name()))
  42        if expected_arch is not None:
  43            report(arch.name() == expected_arch,
  44                   "connected to {}".format(expected_arch))
  45    except (gdb.error, AttributeError):
  46        print("SKIP: not connected")
  47        gdb_exit(0)
  48
  49    if gdb.parse_and_eval("$pc") == 0:
  50        print("SKIP: PC not set")
  51        gdb_exit(0)
  52
  53    try:
  54        test()
  55    except:
  56        print("GDB Exception:")
  57        traceback.print_exc(file=sys.stdout)
  58        global fail_count
  59        fail_count += 1
  60        if "QEMU_TEST_INTERACTIVE" in os.environ:
  61            import code
  62            code.InteractiveConsole(locals=globals()).interact()
  63        raise
  64
  65    try:
  66        gdb.execute("kill")
  67    except gdb.error:
  68        pass
  69
  70    print("All tests complete: {} failures".format(fail_count))
  71    gdb_exit(fail_count)
  72