diff --git a/libcxx/test/libcxx/gdb/gdb_pretty_printer_test.py b/libcxx/test/libcxx/gdb/gdb_pretty_printer_test.py --- a/libcxx/test/libcxx/gdb/gdb_pretty_printer_test.py +++ b/libcxx/test/libcxx/gdb/gdb_pretty_printer_test.py @@ -105,6 +105,7 @@ test_bp.enabled = True test_bp.silent = True test_bp.commands = "print_and_compare\ncontinue" + # "run" won't return if the program exits; ensure the script regains control. gdb.events.exited.connect(exit_handler) gdb.execute("run") diff --git a/libcxx/test/libcxx/gdb/gdb_pretty_printer_test.sh.cpp b/libcxx/test/libcxx/gdb/gdb_pretty_printer_test.sh.cpp --- a/libcxx/test/libcxx/gdb/gdb_pretty_printer_test.sh.cpp +++ b/libcxx/test/libcxx/gdb/gdb_pretty_printer_test.sh.cpp @@ -7,7 +7,7 @@ // //===----------------------------------------------------------------------===// -// REQUIRES: host-has-gdb +// REQUIRES: host-has-gdb-with-python // UNSUPPORTED: libcpp-has-no-localization // UNSUPPORTED: c++03 diff --git a/libcxx/utils/libcxx/test/features.py b/libcxx/utils/libcxx/test/features.py --- a/libcxx/utils/libcxx/test/features.py +++ b/libcxx/utils/libcxx/test/features.py @@ -10,6 +10,7 @@ import re import shutil import sys +from subprocess import check_output, CalledProcessError, DEVNULL _isClang = lambda cfg: '__clang__' in compilerMacros(cfg) and '__apple_build_version__' not in compilerMacros(cfg) _isAppleClang = lambda cfg: '__apple_build_version__' in compilerMacros(cfg) @@ -159,10 +160,34 @@ Feature(name='buildhost=windows', when=lambda cfg: platform.system().lower().startswith('windows')) ] -# Detect whether GDB is on the system, and if so add a substitution to access it. +# Detect whether GDB is on the system, has Python scripting and supports +# adding breakpoint commands. If so add a substitution to access it. +def check_gdb(cfg): + gdb_path = shutil.which('gdb') + if gdb_path is None: + return False + + # Check that we can set breakpoint commands, which was added in 8.3 + test_src = """\ +try: + gdb.Breakpoint(\"main\").commands=\"foo\" +except AttributeError: + gdb.execute(\"quit 1\") +gdb.execute(\"quit\")""" + + try: + stdout = check_output([gdb_path, "-ex", "python " + test_src, "--batch"], + stderr=DEVNULL, universal_newlines=True) + except CalledProcessError: + # We can't set breakpoint commands + return False + + # Check we actually ran the Python + return not "Python scripting is not supported" in stdout + DEFAULT_FEATURES += [ - Feature(name='host-has-gdb', - when=lambda cfg: shutil.which('gdb') is not None, + Feature(name='host-has-gdb-with-python', + when=check_gdb, actions=[AddSubstitution('%{gdb}', lambda cfg: shutil.which('gdb'))] ) ]