ipython / ipykernel

IPython Kernel for Jupyter
https://ipykernel.readthedocs.io/en/stable/
BSD 3-Clause "New" or "Revised" License
631 stars 361 forks source link

`breakpoint()` not working #897

Open fcollonval opened 2 years ago

fcollonval commented 2 years ago

Using a fresh install of Jupyter Lab my usual breakpoint() to invoke the debugger in a Notebook is skipped (see screenshot). Using import pdb; pdb.set_trace() instead invokes pdb as expected.

I was expecting (am I wrong?) that a call to breakpoint() in a cell would invoke pdb.

This is using a fresh conda install of Jupyter Lab this morning, no reconfiguration of the environment has occurred.

Description

image

Reproduce

I've created a fresh minimal environment:

$ conda create -n tmp_env python=3.8 jupyterlab

$ jupyter --version
jupyter core     : 4.7.1
jupyter-notebook : 6.4.3
qtconsole        : not installed
ipython          : 7.27.0
ipykernel        : 6.3.1
jupyter client   : 7.0.2
jupyter lab      : 3.1.10
nbconvert        : 6.1.0
ipywidgets       : not installed
nbformat         : 5.1.3
traitlets        : 5.1.0

and then I run jupyter lab and try to call breakpoint() as noted in the screenshot above.

I used jupyter lab --debug and scanned the output, nothing looked amiss (but there's a lot and I'm not sure what to look for) - I can attach a copy if needed?

I noticed this originally in a second more complex environment (also built today, making me think this is a library update issue somewhere) and I made the above simple environment to try to narrow things down, but the issue remains.

Environment

Linux Cinnamon using Anaconda with Firefox, the OS is all up to date.

$ inxi -b
System:    Host: ian-XPS-15-9550 Kernel: 5.4.0-77-generic x86_64 bits: 64 Desktop: Cinnamon 4.8.6 
           Distro: Linux Mint 20.1 Ulyssa 
Machine:   Type: Laptop System: Dell product: XPS 15 9550 v: N/A serial: <superuser/root required> 
           Mobo: Dell model: 0N7TVV v: A00 serial: <superuser/root required> UEFI [Legacy]: Dell v: 1.9.0 date: 10/11/2018

originally posted by @ianozsvald on https://github.com/jupyterlab/jupyterlab/issues/10996

javier-hm commented 2 years ago

Hi! I have Jupiter Notebook version 6.4.11. In my case I can't run breakpoint on my notebook.

mdengler commented 2 years ago

Can confirm it's still broken.

image

$ poetry run jupyter --version
Selected Jupyter core packages...
IPython          : 8.2.0
ipykernel        : 6.13.0
ipywidgets       : 7.7.0
jupyter_client   : 7.2.2
jupyter_core     : 4.10.0
jupyter_server   : 1.16.0
jupyterlab       : 3.3.4
nbclient         : 0.5.13
nbconvert        : 6.5.0
nbformat         : 5.3.0
notebook         : 6.4.11
qtconsole        : 5.3.0
traitlets        : 5.1.1

$ cat /etc/fedora-release
Fedora release 35 (Thirty Five)

$ uname -a
Linux cdcx4 5.17.11-200.fc35.x86_64 #1 SMP PREEMPT Wed May 25 14:56:43 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
Tim-K-DFW commented 1 year ago

Any updates on this? The only way I found that works is

import sys

def override_sys_breakpoint(frame=None):
    from IPython.core.debugger import set_trace
    set_trace(frame=frame)

sys.breakpointhook = override_sys_breakpoint

(ipython 7.34.0; jupyterlab 3.2.0)

It worked fine before, so I hope this is just a bug/regression, not a deliberate decision?

kerrickstaley commented 1 year ago

This is caused by debugpy. If you run

import pdb; pdb.runeval('breakpoint()')

you will see that it steps into debugpy code. If you step a few more times you'll see that it eventually hits the line

    327     if not is_client_connected():
    328         log.info("breakpoint() ignored - debugger not attached")
--> 329         return

and so breakpoint() will exit without doing anything.

You can work-around this issue by running python3 -m pip uninstall debugpy in the terminal.

@JohanMabille you added the ipykernel debugpy integration; do you know what needs to be done to get breakpoint() to work out-of-the-box?

astrojuanlu commented 11 months ago

This was very puzzling indeed, although difficult to say if it's a feature or a bug...

If breakpoint() is supposed to be active only when the debugger is enabled, maybe emitting a warning would be better than silently passing.

JohanMabille commented 11 months ago

Sorry for the late reply, I missed your ping @kerrickstaley ! I think you can execute the following code in a notebook cell to start debugpy:

import debugpy
debugpy.listen(("localhost", 5678)) # or debugpy.listen(5678)

Not 100% sure (this is a bit far to be honest), but this should be enough to setup breakpoints

kerrickstaley commented 11 months ago

I think there's a bug here that should be fixed. When you install debugpy [1], it silently breaks the behavior of the breakpoint() function when run in a Jupyter notebook. I think that breakpoint() should always launch pdb unless the user configures it to do something else.

[1] Which in my case I didn't do deliberately; I think it was a dependency of something else I installed.

mdengler commented 11 months ago

[...] breakpoint() is supposed to be active only when the debugger is enabled [...]

Not sure where this statement comes from. breakpoint() is not for use when the debugger is enabled;breakpoint() is the "universal API for entering the debugger" (emphasis mine). Breaking it -- that is, preventing a call to breakpoint() from "entering the debugger" -- is definitely a bug, nor is the expected behavior of breakpoint() to do nothing.

zhanwenchen commented 6 months ago

Any update on this issue? It's been 4 years.

pascal-mueller commented 2 weeks ago

It's been 4.5 years now. :)