From 88e842f17a0ee12ba4c7930eec4401bd954c64d3 Mon Sep 17 00:00:00 2001 From: Eric Charles Date: Mon, 14 Feb 2022 09:13:25 +0100 Subject: [PATCH 1/2] enable standard library debugging via config --- ipykernel/debugger.py | 12 +++++++----- ipykernel/ipkernel.py | 3 ++- ipykernel/kernelbase.py | 9 +++++++++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/ipykernel/debugger.py b/ipykernel/debugger.py index bc26c5189..e5df66591 100644 --- a/ipykernel/debugger.py +++ b/ipykernel/debugger.py @@ -270,13 +270,14 @@ class Debugger: 'richInspectVariables', 'modules' ] - def __init__(self, log, debugpy_stream, event_callback, shell_socket, session): + def __init__(self, log, debugpy_stream, event_callback, shell_socket, session, just_my_code): self.log = log self.debugpy_client = DebugpyClient(log, debugpy_stream, self._handle_event) self.shell_socket = shell_socket self.session = session self.is_started = False self.event_callback = event_callback + self.just_my_code = just_my_code self.stopped_queue = Queue() self.started_debug_handlers = {} @@ -515,11 +516,12 @@ async def attach(self, message): 'port': port } message['arguments']['logToFile'] = True - # Reverts that option for now since it leads to spurious break of the code - # in ipykernel source and resuming the execution leads to several errors - # in the kernel. + # Experimental option to break in non-user code. + # The ipykernel source is in the call stack, so the user + # has to manipulate the step-over and step-into in a wize way. # Set debugOptions for breakpoints in python standard library source. - # message['arguments']['debugOptions'] = [ 'DebugStdLib' ] + if not self.just_my_code: + message['arguments']['debugOptions'] = [ 'DebugStdLib' ] return await self._forward_message(message) async def configurationDone(self, message): diff --git a/ipykernel/ipkernel.py b/ipykernel/ipkernel.py index 2941ce34c..de4f47069 100644 --- a/ipykernel/ipkernel.py +++ b/ipykernel/ipkernel.py @@ -83,7 +83,8 @@ def __init__(self, **kwargs): self.debugpy_stream, self._publish_debug_event, self.debug_shell_socket, - self.session) + self.session, + self.debug_just_my_code) # Initialize the InteractiveShell subclass self.shell = self.shell_class.instance(parent=self, diff --git a/ipykernel/kernelbase.py b/ipykernel/kernelbase.py index 622f1ca05..e7145df4e 100644 --- a/ipykernel/kernelbase.py +++ b/ipykernel/kernelbase.py @@ -127,6 +127,15 @@ def _default_ident(self): # any links that should go in the help menu help_links = List() + # Experimental option to break in non-user code. + # The ipykernel source is in the call stack, so the user + # has to manipulate the step-over and step-into in a wize way. + debug_just_my_code = Bool(True, + help="""Set to False if you want to debug python standard and dependent libraries. + """ + ).tag(config=True) + + # track associations with current request # Private interface _darwin_app_nap = Bool(True, From bd0f200dcf2cdcd48ba9fdf4d8a43187a67ff48f Mon Sep 17 00:00:00 2001 From: Eric Charles Date: Tue, 15 Feb 2022 07:42:56 +0100 Subject: [PATCH 2/2] just_my_code as optional arg in Debugger constructor --- ipykernel/debugger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipykernel/debugger.py b/ipykernel/debugger.py index e5df66591..dd145d802 100644 --- a/ipykernel/debugger.py +++ b/ipykernel/debugger.py @@ -270,7 +270,7 @@ class Debugger: 'richInspectVariables', 'modules' ] - def __init__(self, log, debugpy_stream, event_callback, shell_socket, session, just_my_code): + def __init__(self, log, debugpy_stream, event_callback, shell_socket, session, just_my_code = True): self.log = log self.debugpy_client = DebugpyClient(log, debugpy_stream, self._handle_event) self.shell_socket = shell_socket