93a3048dcf
GDB commit a207f6b3a38 ('Rewrite "python" command exception handling') changed how exit() called from Python scripts loaded by GDB behave, turning it into an exception instead of a generic error code that is returned. This change caused several QEMU tests to crash with the following exception: Python Exception <class 'SystemExit'>: 0 Error occurred in Python: 0 This happens because in tests/guest-debug/test_gdbstub.py exit is called after the tests have completed. This commit fixes it by politely asking GDB to exit via gdb.execute, passing the proper fail_count to be reported to 'make', instead of abruptly calling exit() from the Python script. Signed-off-by: Gustavo Romero <gustavo.romero@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-ID: <20240515173132.2462201-4-gustavo.romero@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
61 lines
1.4 KiB
Python
61 lines
1.4 KiB
Python
"""Helper functions for gdbstub testing
|
|
|
|
"""
|
|
from __future__ import print_function
|
|
import gdb
|
|
import os
|
|
import sys
|
|
import traceback
|
|
|
|
fail_count = 0
|
|
|
|
|
|
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")
|
|
exit(0)
|
|
|
|
if gdb.parse_and_eval("$pc") == 0:
|
|
print("SKIP: PC not set")
|
|
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.execute(f"exit {fail_count}")
|