你如何观察pdb中的变量

新手上路,请多包涵

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

原文由 Nathaniel Flath 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 559
1 个回答

pdb数据断点

…就像您可以在 gdb 中查看内存地址一样…

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

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

要在遇到 断点 时观察变量,可以使用 commands 命令。例如打印 some_variable 遇到断点 #1( 来自 pdb doc 的规范示例)。

 (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

原文由 dnozay 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏