https://github.com/python/cpython/commit/61bb57fa3fb59e545561df65b655ac137063a30e commit: 61bb57fa3fb59e545561df65b655ac137063a30e branch: 3.15 author: Miss Islington (bot) <[email protected]> committer: pablogsal <[email protected]> date: 2026-06-27T17:24:53Z summary:
[3.15] gh-152434: Block --async-aware with --binary (GH-152444) (#152446) gh-152434: Block --async-aware with --binary (GH-152444) The binary writer does not currently handle AwaitedInfo samples and crashes when running in --async-aware mode. (cherry picked from commit 876c06cab9e824747d708a031c6b81b1f8a4f8dc) Co-authored-by: László Kiss Kollár <[email protected]> files: M Lib/profiling/sampling/cli.py M Lib/test/test_profiling/test_sampling_profiler/test_cli.py diff --git a/Lib/profiling/sampling/cli.py b/Lib/profiling/sampling/cli.py index a5d9573ae6b6ddd..0330c15c014545c 100644 --- a/Lib/profiling/sampling/cli.py +++ b/Lib/profiling/sampling/cli.py @@ -875,13 +875,15 @@ def _validate_args(args, parser): if hasattr(args, 'live') and args.live: parser.error("--subprocesses is incompatible with --live mode.") - # Async-aware mode is incompatible with --native, --no-gc, --mode, and --all-threads + # Async-aware mode is incompatible with options that need thread data. if getattr(args, 'async_aware', False): issues = [] if getattr(args, 'native', False): issues.append("--native") if not getattr(args, 'gc', True): issues.append("--no-gc") + if getattr(args, 'format', None) == "binary": + issues.append("--binary") if hasattr(args, 'mode') and args.mode != "wall": issues.append(f"--mode={args.mode}") if hasattr(args, 'all_threads') and args.all_threads: diff --git a/Lib/test/test_profiling/test_sampling_profiler/test_cli.py b/Lib/test/test_profiling/test_sampling_profiler/test_cli.py index 9c0734ac804e1bc..0181095ca21e375 100644 --- a/Lib/test/test_profiling/test_sampling_profiler/test_cli.py +++ b/Lib/test/test_profiling/test_sampling_profiler/test_cli.py @@ -866,6 +866,23 @@ def test_async_aware_incompatible_with_all_threads(self): self.assertIn("--all-threads", error_msg) self.assertIn("incompatible with --async-aware", error_msg) + def test_async_aware_incompatible_with_binary(self): + """Test --async-aware is incompatible with --binary.""" + test_args = ["profiling.sampling.cli", "attach", "12345", + "--async-aware", "--binary"] + + with ( + mock.patch("sys.argv", test_args), + mock.patch("sys.stderr", io.StringIO()) as mock_stderr, + self.assertRaises(SystemExit) as cm, + ): + main() + + self.assertEqual(cm.exception.code, 2) # argparse error + error_msg = mock_stderr.getvalue() + self.assertIn("--binary", error_msg) + self.assertIn("incompatible with --async-aware", error_msg) + @unittest.skipIf(is_emscripten, "subprocess not available") def test_run_nonexistent_script_exits_cleanly(self): """Test that running a non-existent script exits with a clean error.""" _______________________________________________ Python-checkins mailing list -- [email protected] To unsubscribe send an email to [email protected] https://mail.python.org/mailman3//lists/python-checkins.python.org Member address: [email protected]
