Variable ListBox crashes for long variables repr
- Dominant language
- Python
- Stars
- 3.2k
- Forks
- 245
- Avg merge
- 13m
- Merged PRs (30d)
- 5
Description
**Describe the bug**
When using `stringifier = repr` and there are several variables with a long repr in the local scope, pudb crashes somewhere in `urwid/widget/listbox.py::755` with an error like
```
urwid.widget.listbox.ListBoxError: Widget at position 1 within listbox calculated 111 rows but rendered 110!
```
This started happening in the last 2-3 months, I think, but I haven't had time to track it down.
Full traceback
```
Traceback (most recent call last):
File "/usr/lib/python3.12/site-packages/pudb/__init__.py", line 162, in runscript
dbg._runscript(mainpyfile)
File "/usr/lib/python3.12/site-packages/pudb/debugger.py", line 534, in _runscript
self.run(statement)
File "/usr/lib/python3.12/bdb.py", line 600, in run
exec(cmd, globals, locals)
File "", line 1, in
File "pudb-bug.py", line 9, in
r = np.sqrt(x ** 2 + y ** 2 + z ** 2)
^
File "/usr/lib/python3.12/bdb.py", line 94, in trace_dispatch
return self.dispatch_return(frame, arg)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/bdb.py", line 153, in dispatch_return
self.user_return(frame, arg)
File "/usr/lib/python3.12/site-packages/pudb/debugger.py", line 479, in user_return
self.interaction(frame)
File "/usr/lib/python3.12/site-packages/pudb/debugger.py", line 436, in interaction
self.ui.call_with_ui(self.ui.interaction, exc_tuple,
File "/usr/lib/python3.12/site-packages/pudb/debugger.py", line 2556, in call_with_ui
return f(*args, **kwargs)
^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/pudb/debugger.py", line 2879, in interaction
self.event_loop()
File "/usr/lib/python3.12/site-packages/pudb/debugger.py", line 2834, in event_loop
canvas = toplevel.render(self.size, focus=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/widget.py", line 112, in cached_render
canv = fn(self, size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/widget.py", line 711, in render
canv = get_delegate(self).render(size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/widget.py", line 112, in cached_render
canv = fn(self, size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/frame.py", line 481, in render
body = self.body.render((maxcol, maxrow - ftrim - htrim), focus and self.focus_part == "body")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/widget.py", line 112, in cached_render
canv = fn(self, size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/attr_map.py", line 158, in render
canv = self._original_widget.render(size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/widget.py", line 112, in cached_render
canv = fn(self, size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/columns.py", line 1026, in render
w.render(w_size, focus=focus and self.focus_position == i),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/widget.py", line 112, in cached_render
canv = fn(self, size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/widget.py", line 711, in render
canv = get_delegate(self).render(size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/widget.py", line 112, in cached_render
canv = fn(self, size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/pile.py", line 873, in render
canv = w.render(w_size, focus=focus and item_focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/widget.py", line 112, in cached_render
canv = fn(self, size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/attr_map.py", line 158, in render
canv = self._original_widget.render(size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/widget.py", line 112, in cached_render
canv = fn(self, size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/pile.py", line 873, in render
canv = w.render(w_size, focus=focus and item_focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/widget.py", line 112, in cached_render
canv = fn(self, size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/attr_map.py", line 158, in render
canv = self._original_widget.render(size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/widget.py", line 112, in cached_render
canv = fn(self, size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/widget.py", line 711, in render
canv = get_delegate(self).render(size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/widget.py", line 112, in cached_render
canv = fn(self, size, focus=focus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/site-packages/urwid/widget/listbox.py", line 755, in render
raise ListBoxError(
urwid.widget.listbox.ListBoxError: Widget at position 1 within listbox calculated 111 rows but rendered 110!
```
**To Reproduce**
For a simple reproducer
```
import numpy as np
rng = np.random.default_rng()
x = rng.random(512)
y = rng.random(512)
z = rng.random(512)
r = np.sqrt(x ** 2 + y ** 2 + z ** 2)
```
and then running `python -m pudb reproducer.py` and pressing `n` a few times will cause the crash above.
**Versions**
* python 3.12.3
* pudb [e340f1d](https://github.com/inducer/pudb/commit/e340f1d087098a0564e0e14200a6614e0da3fe61)
* urwid 2.6.10
* Linux archlinux 6.9.2-arch1
Contributor guide
No contributing guide indexed for this repository
Research direction
Start by running the supplied NumPy reproducer with `python -m pudb reproducer.py` and pressing `n` until the crash occurs. Then inspect pudb/debugger.py around `interaction`, `event_loop`, and rendering, alongside the reported urwid listbox failure. Done means long variable representations no longer produce the ListBoxError.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- numpy, python
- Domain
- cli, devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100