PDB:如何检查嵌套栈帧中函数的局部变量?
背景:
我正在通过PDB(Python调试器)运行一些Python代码。当我设置了一个断点并且程序停在那的时候,我可以使用以下命令查看当前作用域内的局部变量:
(Pdb) locals()
这会打印出一个很好的字典,里面包含了局部变量的名称和值,正好是我暂停时的状态。太完美了!
我还可以使用PDB的where
命令查看调用栈,这样会得到类似下面的输出:
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py(400)run()
-> exec cmd in globals, locals
<string>(1)<module>()
.../main.py(116)<module>()
-> run()
.../main.py(104)run()
-> res = quicksort(res)
> .../main.py(68)quicksort()
-> if len(v) <= 1:
在这个例子中,我停在了quicksort()
函数里,而这个函数是由run()
函数调用的。
到目前为止,一切都很好。
问题:
如果我可以通过调用locals()
来查看quicksort()
函数的局部变量,那我怎么才能查看run()
函数的局部变量呢?
换句话说,我想知道如何查看在调用栈中嵌套的函数的局部变量。
重要说明: 我不想继续执行或进入run()
函数来查看它的局部变量。我想从我当前暂停的状态中,查看在调用栈中当前嵌套的run()
栈帧里的局部变量。
1 个回答
40
(i)pdb
提供了 up
和 down
这两个命令,让你可以在调用栈中“旅行”,这样你就可以查看更高层次的调用,并检查那里的局部变量。
你可以使用 u(p)
或 d(own)
来向上或向下跳转调用栈。你还可以通过给 u(p)
或 d(own)
传递一个数字,来指定要跳过多少层。