From 225aba7ecdcfd90a2819ca6d57be10c46f41aec6 Mon Sep 17 00:00:00 2001 From: Matt Wozniski Date: Tue, 6 May 2025 00:09:41 -0400 Subject: [PATCH 1/2] Add color support to remote PDB --- Lib/pdb.py | 29 +++++++++++++++++-- ...-05-06-00-10-10.gh-issue-133490.Ubrppz.rst | 1 + 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-05-06-00-10-10.gh-issue-133490.Ubrppz.rst diff --git a/Lib/pdb.py b/Lib/pdb.py index 225bbb9c5e592b..4efda171b7a813 100644 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -2677,6 +2677,7 @@ def __init__( sockfile, signal_server=None, owns_sockfile=True, + colorize=False, **kwargs, ): self._owns_sockfile = owns_sockfile @@ -2687,7 +2688,10 @@ def __init__( if signal_server: # Only started by the top level _PdbServer, not recursive ones. self._start_signal_listener(signal_server) + # Override the `colorize` attribute set by the parent constructor, + # because it checks the server's stdout, rather than the client's. super().__init__(colorize=False, **kwargs) + self.colorize = colorize @staticmethod def protocol_version(): @@ -2975,7 +2979,11 @@ def do_interact(self, arg): @typing.override def _create_recursive_debugger(self): - return _PdbServer(self._sockfile, owns_sockfile=False) + return _PdbServer( + self._sockfile, + owns_sockfile=False, + colorize=self.colorize, + ) @typing.override def _prompt_for_confirmation(self, prompt, default): @@ -3336,7 +3344,16 @@ def complete(self, text, state): return None -def _connect(*, host, port, frame, commands, version, signal_raising_thread): +def _connect( + *, + host, + port, + frame, + commands, + version, + signal_raising_thread, + colorize, +): with closing(socket.create_connection((host, port))) as conn: sockfile = conn.makefile("rwb") @@ -3347,7 +3364,11 @@ def _connect(*, host, port, frame, commands, version, signal_raising_thread): else: signal_server = None - remote_pdb = _PdbServer(sockfile, signal_server=signal_server) + remote_pdb = _PdbServer( + sockfile, + signal_server=signal_server, + colorize=colorize, + ) weakref.finalize(remote_pdb, sockfile.close) if Pdb._last_pdb_instance is not None: @@ -3379,6 +3400,7 @@ def attach(pid, commands=()): ) use_signal_thread = sys.platform == "win32" + colorize = _colorize.can_colorize() connect_script.write( textwrap.dedent( @@ -3391,6 +3413,7 @@ def attach(pid, commands=()): commands={json.dumps("\n".join(commands))}, version={_PdbServer.protocol_version()}, signal_raising_thread={use_signal_thread!r}, + colorize={colorize!r}, ) """ ) diff --git a/Misc/NEWS.d/next/Library/2025-05-06-00-10-10.gh-issue-133490.Ubrppz.rst b/Misc/NEWS.d/next/Library/2025-05-06-00-10-10.gh-issue-133490.Ubrppz.rst new file mode 100644 index 00000000000000..beaa8db7fa93c6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-05-06-00-10-10.gh-issue-133490.Ubrppz.rst @@ -0,0 +1 @@ +Add color support to PDB in remote mode. From a6eaecbc2bcc30246444f699df4dbcc3fef9be40 Mon Sep 17 00:00:00 2001 From: Matt Wozniski Date: Tue, 6 May 2025 00:38:28 -0400 Subject: [PATCH 2/2] Update tests to pass colorize=False to _connect --- Lib/test/test_remote_pdb.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Lib/test/test_remote_pdb.py b/Lib/test/test_remote_pdb.py index 9c794991dd5ed9..7c77bedb766c53 100644 --- a/Lib/test/test_remote_pdb.py +++ b/Lib/test/test_remote_pdb.py @@ -1040,6 +1040,7 @@ def dummy_function(): commands="", version=pdb._PdbServer.protocol_version(), signal_raising_thread=False, + colorize=False, ) return x # This line won't be reached in debugging @@ -1210,6 +1211,7 @@ def bar(): commands="", version=pdb._PdbServer.protocol_version(), signal_raising_thread=True, + colorize=False, ) print("Connected to debugger") iterations = 50 @@ -1301,6 +1303,7 @@ def run_test(): commands="", version=fake_version, signal_raising_thread=False, + colorize=False, ) # This should print if the debugger detaches correctly