python - 如何查看 pdb 中的变量

标签 python pdb

我正在调试一个 python 脚本,我想观察一个变量的变化(就像你可以在 gdb 中观察一个内存地址一样)。有没有办法做到这一点?

最佳答案

使用 pdb 的数据断点

...much like you can watch a memory address in gdb...

  • GDB 使用数据断点,这通过硬件 支持(硬件观察点)变得容易,这通常涉及将内存页面标记为只读,然后在内存访问时触发异常处理程序。当硬件观察点不可用时,它使用软件观察点,这些仅在单线程中有用并且速度要慢得多。
  • PDB 不支持数据断点,因此简短的回答是NO,您无法使用 PDB 做到这一点开箱即用。

在 pdb 中遇到断点时打印变量

要在遇到 断点 时查看变量,可以使用 commands 命令。例如。在遇到断点 #1 ( canonical example from pdb doc ) 时打印 some_variable

(Pdb) commands 1
(com) print(some_variable)
(com) end
(Pdb)

此外,您可以使用 condition 命令确保仅在变量取特定值时才触发断点。

例如:

(Pdb) condition 1 some_variable==some_value

其他解决方案

您可以使用跟踪/分析功能通过 sys.settrace 逐步检查事物并检查正在执行的操作码。

这里有一些代码可以帮助您入门:

import sys
import dis


def tracefn(frame, event, arg):
    if event == 'call':
        print("## CALL", frame)
        frame.f_trace_opcodes = True
    elif event == 'opcode':
        opcode = frame.f_code.co_code[frame.f_lasti]
        opname = dis.opname[opcode]
        print("## OPCODE", opname)
    return tracefn


watchme = 123

def foo():
    global watchme
    watchme = 122

sys.settrace(tracefn)

foo()

您可能需要监视所有 STORE_* 操作码。 https://docs.python.org/3/library/dis.html

关于python - 如何查看 pdb 中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7668979/

相关文章:

Django - 使用 pdb 交互式调试 wsgi 运行应用程序

python - 如何调试采用标准输入的 python CLI?

python - 如何在 SciPy 中获得类似 Simplex 的 "robustness"和边界?

python - Python 中的多元组到两对元组?

python - PDB.run - 重新启动 pdb session

python - 导入模块(但不使用它)会降低 Python 的性能吗?

python - 你能跳到循环中的第 n 次迭代吗?

python - 通过变量获取属性

Python - 从字典列表创建字典

python - pyspark:重新分区后出现 "too many values"错误