https://github.com/python/cpython/commit/876c06cab9e824747d708a031c6b81b1f8a4f8dc
commit: 876c06cab9e824747d708a031c6b81b1f8a4f8dc
branch: main
author: László Kiss Kollár <[email protected]>
committer: pablogsal <[email protected]>
date: 2026-06-27T16:55:57Z
summary:
gh-152434: Block --async-aware with --binary (#152444)
The binary writer does not currently handle AwaitedInfo samples and
crashes when running in --async-aware mode.
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]