inducer / inducer/pudb

Variable ListBox crashes for long variables repr

Open
#652 5 comments 3 reactions 0 assignees View on GitHub
Bug
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.