aboutsummaryrefslogtreecommitdiff
path: root/tests/guest-debug/test_gdbstub.py
blob: 4f08089e6a982a289ab26d6c7e03528e7c934597 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
"""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)