[Python-Dev] bdb.py change from 1.31 to 1.31.2.1

Gerson Kurz Gerson.Kurz@t-online.de
Sun, 10 Nov 2002 20:22:19 +0100


I have a problem with the current version of Pythonwin that I think I have
tracked down to a change in bdb.py change 1.31 to 1.31.2.1, which dates
2002/05/29. Before you moan: "Pythonwin <> Python", please read on.

* PROBLEM DESCRIPTION *

In old versions of Pythonwin, pressing F5 = Debugger\Go when a source is
active results in the code getting executed normally. Only when the debugger
hits a breakpoint, (or an exception), the debugger is actually entered.

In the current version of Pythonwin (that is, "PythonWin 2.2.2 (#37, Oct 14
2002, 17:02:34) [MSC 32 bit (Intel)] on win32." using win32all build 150),
pressing F5 = Debugger\Go will stop on the first line.

Actually, it is worse, because the current version doesn't break on the
first line of code, but somewhere inside pywin.debugger.debugger.Debugger.
There was a thread about this recently on clp, and Mark Hammond proposed a
fix (see <news:P4jw9.22603$jE1.72999@news-server.bigpond.net.au>) which
takes on this bit - but doesn't change the "Go = break at first line of
code" behaviour.

* BUT IS IT REALLY A PROBLEM *

I think so, because

a) it is a (for me unexpected) change in behaviour from Pythonwin versions,
b) it is redundant - because you can always use "Debugger\Step in" to step
into the source using the first line if you really want to
c) I know, people will stare at me madly for saying this, but in other
Debuggers I've worked with, "Debugger\Go" does not mean "Debugger\Go but
only after another Go after the first line", but, rather, "Debugger\Go", as
one would think the name indicates.

* WORKAROUND *

After lots of debugging I narrowed the problem down to bdb.py, and further
to dispatch_call(). It seems that in the old version, the code read

# First call of dispatch since reset()
self.botframe = frame

and was changed to

# First call of dispatch since reset()
# (CT) Note that this may also be None!
self.botframe = frame.f_back

When I revert the change (i.e. use "frame" rather than "frame.f_back") there
is no initial callback, and everything works fine. I'm not quite clear just
as to *why* it works, but it *does* work. FYI: The code actually breaks
later in stop_here(), which was *also* changed as part of that particular
checkin.

* QUESTION *

Actually, two questions

1) Can somebody explain that change to me? What was it intended to solve? (I
don't know what the suffix "CT" stands for - there is no username to that
effect in the python sourceforge page that I could find.)

2) Is it a bug or a feature (i.e. a pythonwin bug rather than a bdb.py bug)
or not-a-bug-at-all ?