gpt4 book ai didi

Python pdb(调试器)disp 等效?

转载 作者:太空狗 更新时间:2023-10-29 18:33:03 25 4
gpt4 key购买 nike

在gdb中是否有等同于disp的pdb?

例如当我使用 gdb 调试 C 时,我可以在代码的每个“步骤”上打印变量,方法是键入:

disp var

当我使用 pdb 调试 python 时,我想要类似的功能,但 disp 似乎不存在,python pdb 文档似乎没有提供替代方案 - 但它似乎是一个奇怪的遗漏?

最佳答案

下面的代码使用 Python 内省(introspection)功能将两个新命令添加到 PDB 模块 0只需将给定的函数及其调用放在一个单独的模块中,并在开始调试之前导入该模块——您应该让“disp”和“undisp”命令对变量添加和收回监视。

它通过 monkeypatching Python 的 pdb 模块来工作,该模块是用纯 python 编写的。

# -*- coding: utf-8 -*-

def patch_pdb():
import pdb

def wrap(func):
def new_postcmd(self, *args, **kw):
result = func(self, *args, **kw)
if hasattr(self, "curframe") and self.curframe and hasattr(self, "watch_list"):
for arg in self.watch_list:
try:
print >> self.stdout, "%s: %s"% (arg, self._getval(arg)) + ", ",
except:
pass
self.stdout.write("\n")
return result #func(self, *args, **kw)

return new_postcmd

pdb.Pdb.postcmd = wrap(pdb.Pdb.postcmd)

def do_disp(self, arg):
if not hasattr(self, "watch_list"):
self.watch_list = []
self.watch_list.append(arg)

pdb.Pdb.do_disp = do_disp

def do_undisp(self, arg):
if hasattr(self, "watch_list"):
try:
self.watch_list.remove(arg)
except:
pass

pdb.Pdb.do_undisp = do_undisp

patch_pdb()

if __name__ == "__main__":
# for testing
import pdb; pdb.set_trace()
a = 0
for i in range(10):
print i
a += 2

不幸的是,我只能让它显示变量的状态,就像它们在执行最后一个命令之前的状态一样。 (我尝试了一点,但是 monkeypatching bdb 模块,它是 Pdb 的基础,似乎也没有用)。您可以尝试更改 pdb.Pdb、bdb.Bdb 或 cmd.Cmd 中由 wrap 修饰的方法,以找到在调试帧状态更改后调用的方法。

关于Python pdb(调试器)disp 等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8520550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com