首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python pdb (调试器)的disp等价?

Python pdb (调试器)的disp等价?
EN

Stack Overflow用户
提问于 2011-12-15 21:04:14
回答 3查看 1.5K关注 0票数 10

gdb中有没有等同于disp的pdb?

例如,当我使用gdb调试C语言时,我可以通过输入以下命令在代码的每个“步骤”上打印变量:

代码语言:javascript
复制
disp var

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

EN

回答 3

Stack Overflow用户

发布于 2011-12-16 09:01:14

下面的代码使用Python自省功能向PDB模块添加两个新命令,只需将给定的函数及其调用放入一个单独的模块中,并在开始调试之前导入此模块-您应该使用'disp‘和'undisp’命令向变量添加和收回监视。

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

代码语言:javascript
复制
# -*- 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的基础,似乎不能正常工作)。您可以尝试更改由wrap修饰的pdb.Pdb、bdb.Bdb或cmd.Cmd中的方法,以找到在调试的帧状态更改后调用的方法。

票数 3
EN

Stack Overflow用户

发布于 2011-12-16 09:50:48

您可以设置一些别名,它们将为您完成此操作:

代码语言:javascript
复制
alias n next;; p var
alias s step;; p var

打印整个变量名列表留给读者作为练习。不幸的是,这样做意味着当您向调试器发送一个空行时,它执行的“最后一个命令”是p var而不是n。如果你想解决这个问题,那么你可以使用下面这组有点老套的Pdb命令:

代码语言:javascript
复制
!global __stack; from inspect import stack as __stack
!global __Pdb; from pdb import Pdb as __Pdb
!global __pdb; __pdb = [__framerec[0].f_locals.get("pdb") or __framerec[0].f_locals.get("self") for __framerec in __stack() if (__framerec[0].f_locals.get("pdb") or __framerec[0].f_locals.get("self")).__class__ == __Pdb][-1]

alias s step;; p var;; !__pdb.lastcmd = "!__pdb.cmdqueue.append('s')"
alias n next;; p var;; !__pdb.lastcmd = "!__pdb.cmdqueue.append('n')"
票数 3
EN

Stack Overflow用户

发布于 2011-12-15 21:36:11

在pdb调试期间,您可以输入普通的python代码,而不仅仅是一个字母的命令-所以只使用print var就可以了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8520550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档