PDB:如何检查嵌套栈帧中函数的局部变量?

23 投票
1 回答
10265 浏览
提问于 2025-04-18 05:30

背景:

我正在通过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 提供了 updown 这两个命令,让你可以在调用栈中“旅行”,这样你就可以查看更高层次的调用,并检查那里的局部变量。

你可以使用 u(p)d(own) 来向上或向下跳转调用栈。你还可以通过给 u(p)d(own) 传递一个数字,来指定要跳过多少层。

撰写回答