accessing local variables from the pdb debugger

  • Thread starter Jean-Michel Pichavant
  • Start date
J

Jean-Michel Pichavant

Guys,

I have some problem changing method locals with pdb:

import pdb

def test():
foo = 'foo'
pdb.set_trace()

test()
--Return--
> /home/jeanmichel/trunk/tnt/test.py(5)test()->None
-> pdb.set_trace()
(Pdb) print foo
foo
(Pdb) foo = 'bar'
(Pdb) print foo
foo
(Pdb)


I tried using locals() but it returns a copy of the locals. So changing
locals['foo'] won't do any good.
(Pdb) locals()
Out[6]: {'__return__': None, 'foo': 'foo'}


Any idea ? I'm starting to wonder if it is possible.

JM
 
D

Diez B. Roggisch

Jean-Michel Pichavant said:
Guys,

I have some problem changing method locals with pdb:

import pdb

def test():
foo = 'foo'
pdb.set_trace()

test()
--Return--
/home/jeanmichel/trunk/tnt/test.py(5)test()->None
-> pdb.set_trace()
(Pdb) print foo
foo
(Pdb) foo = 'bar'
(Pdb) print foo
foo
(Pdb)


I tried using locals() but it returns a copy of the locals. So changing
locals['foo'] won't do any good.
(Pdb) locals()
Out[6]: {'__return__': None, 'foo': 'foo'}


Any idea ? I'm starting to wonder if it is possible.

I recall having some issues with local variables sometimes, but actually
your example works fine for me:



def test():
foo = "foo"


import pdb; pdb.set_trace()

print foo

test()


And the session:

$ python /tmp/test.py
/tmp/test.py(9)test()
-> print foo
(Pdb) pp foo
'foo'
(Pdb) foo = "bar"
(Pdb) n
bar
--Return--
/tmp/test.py(9)test()->None
-> print foo
(Pdb) c


Diez
 
J

Jean-Michel Pichavant

Diez said:
Jean-Michel Pichavant wrote:

Guys,

I have some problem changing method locals with pdb:

import pdb

def test():
foo = 'foo'
pdb.set_trace()

test()
--Return--
/home/jeanmichel/trunk/tnt/test.py(5)test()->None
-> pdb.set_trace()
(Pdb) print foo
foo
(Pdb) foo = 'bar'
(Pdb) print foo
foo
(Pdb)


I tried using locals() but it returns a copy of the locals. So changing
locals['foo'] won't do any good.
(Pdb) locals()
Out[6]: {'__return__': None, 'foo': 'foo'}


Any idea ? I'm starting to wonder if it is possible.

I recall having some issues with local variables sometimes, but actually
your example works fine for me:



def test():
foo = "foo"


import pdb; pdb.set_trace()

print foo

test()


And the session:

$ python /tmp/test.py
/tmp/test.py(9)test()
-> print foo
(Pdb) pp foo
'foo'
(Pdb) foo = "bar"
(Pdb) n
bar
--Return--
/tmp/test.py(9)test()->None
-> print foo
(Pdb) c


Diez
You're right, it can work, eventually...

Take a look at sessions below:

def test():
foo = 'foo'
pdb.set_trace()
print 'This is the test method displaying foo:', foo

In [3]: test()
> /home/jeanmichel/trunk/tnt/test.py(6)test()
-> print 'This is the test method displaying foo:', foo
(Pdb) foo='bar'
(Pdb) c
This is the test method displaying foo: bar

In [5]: test()
> /home/jeanmichel/trunk/tnt/test.py(6)test()
-> print 'This is the test method displaying foo:', foo
(Pdb) foo='bar'
(Pdb) print foo
foo
(Pdb) c
This is the test method displaying foo: foo

By just inserting the print foo statement right after changing foo's
value, I've rolled back the value to 'foo' ??? A hell of a wtf pdb feature !

JM

PS : using python 2.5
 
L

Lie Ryan

Diez B. Roggisch wrote:
By just inserting the print foo statement right after changing foo's
value, I've rolled back the value to 'foo' ??? A hell of a wtf pdb
feature !

Apparently it's fixed in 2.7 and 3.1

D:\Lie Ryan\Desktop>python27 d.py
> d:\lie ryan\desktop\d.py(6)test()
-> print(foo)
(Pdb) foo = "bar"
(Pdb) pp foo
'bar'
(Pdb) c
bar

D:\Lie Ryan\Desktop>python27 d.py
> d:\lie ryan\desktop\d.py(6)test()
-> print(foo)
(Pdb) foo = "bar"
(Pdb) c
bar
 
J

Jean-Michel Pichavant

Lie said:
Apparently it's fixed in 2.7 and 3.1

D:\Lie Ryan\Desktop>python27 d.py
-> print(foo)
(Pdb) foo = "bar"
(Pdb) pp foo
'bar'
(Pdb) c
bar

D:\Lie Ryan\Desktop>python27 d.py
-> print(foo)
(Pdb) foo = "bar"
(Pdb) c
bar
Thanks, that could mean it is a bug from pdb in python 2.5. I tried with
ipython & python, same issue. I'll keep that in mind, sadly it concerns
a basic feature of the debugger.

JM
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top