我正在调试一个 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/