13

I'm trying to learn pdb using this tutorial referenced from another stackoverflow question, and I'm on the 3rd step of the Getting Started section.

In [12]: %paste
# epdb1.py -- experiment with the Python debugger, pdb
import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print final
## -- End pasted text --
--Return--
> <ipython-input-12-48afa1c7ad72>(4)<module>()->None
-> pdb.set_trace()


(Pdb) l
  1     # epdb1.py -- experiment with the Python debugger, pdb
  2     import pdb
  3     a = "aaa"
  4  -> pdb.set_trace()
  5     b = "bbb"
  6     c = "ccc"
  7     final = a + b + c
  8     print final
[EOF]


(Pdb) n
> /Users/jg/anaconda/lib/python2.7/site-packages/IPython/core/interactiveshell.py(3038)run_code()
-> sys.excepthook = old_excepthook
(Pdb) l
3033                    self.hooks.pre_run_code_hook()
3034                    #rprint('Running code', repr(code_obj)) # dbg
3035                    exec(code_obj, self.user_global_ns, self.user_ns)
3036                finally:
3037                    # Reset our crash handler in place
3038 ->                 sys.excepthook = old_excepthook
3039            except SystemExit as e:
3040                if result is not None:
3041                    result.error_in_exec = e
3042                self.showtraceback(exception_only=True)
3043                warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)

It looks like n(ext) should move me to the next line in the current frame:

(Pdb) help next
n(ext)
Continue execution until the next line in the current function
is reached or it returns.

And seems to do that successfully in the tutorial's example. But in my ipython it appears to be moving me to the next line within the pdb.set_trace() code.

How do I simply navigate to the 'b = "bbb"' line?

Community
  • 1
  • 1
user1956609
  • 2,132
  • 5
  • 27
  • 43

1 Answers1

12

Try this in your ipython:

import pdb
def test_pdb_example():
    a = "aaa"
    pdb.set_trace() # use 'n' for navigate to next line
    b = "bbb"
    c = "ccc"
    final = a + b + c
    return final

test_pdb_example()
Tevin Joseph K O
  • 2,574
  • 22
  • 24
  • 1
    That works perfectly for me. How can I get this work without wrapping it inside of a function, and what is the issue when it's not wrapped? – user1956609 Sep 11 '15 at 19:11
  • 1
    @user1956609 As far as I know, when you call pdb.set_trace(), it will try to execute sys._getframe().f_back(). If your code is not wrapped inside a function, sys._getframe().f_back() raises exception. – Tevin Joseph K O Sep 11 '15 at 20:25
  • 11
    Is it a `bug` or a feature? – Timo Feb 08 '18 at 15:43