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}")
 |