【问题标题】:How can I make ipdb show more lines of context while debugging?如何让 ipdb 在调试时显示更多的上下文行?
【发布时间】:2011-06-05 03:46:11
【问题描述】:

默认情况下,在 IPython 中调试期间,ipdb 在代码中的当前位置上方显示一行,下方显示一行。

有没有一种简单的方法可以使显示的区域更大一些?我认为它是可配置的,但一直找不到。

【问题讨论】:

标签: python debugging ipython


【解决方案1】:

您可以在 ipdb 中键入l 以显示更多当前上下文的几行

您可以继续点击l,它会继续显示文件中的更多行

如果您想在当前行周围显示更多上下文行,您可以键入l 来获取当前行。然后输入l curr_line - 10, curr_line + 10。假设我在 50 号线,我想看看周围的 20 条线。我会输入:l 40,60 以查看更多信息。

正如@jrieke 在评论中所指出的,您还可以点击ll 以获得更大的上下文信息。关于ll 的一个好处是它会从当前方法的开头一直打印出来(而连续的ls 会显示断点下方的更多行)。

【讨论】:

  • 补充:您也可以输入ll一次获取更多行。
  • 问题要求默认情况下完成此操作,而不是通过其他用户操作。
【解决方案2】:

您可以通过以下方式获得更多上下文:

ipdb.set_trace(context=21)

永久上下文大小

要永久设置上下文大小,请通过以下操作找到安装目录

python -c 'import ipdb; print(ipdb)'

这将显示一个__init__.py 文件。打开该文件并找到该行(也可以在 IPDB 的__main__.py 中找到:

def set_trace(frame=None, context=3):

3 更改为您想要的任意多的上下文行。

【讨论】:

  • ipdb v0.10.2 尚未发布,我在任何地方都找不到与 IPDB_CONTEXT_SIZE 相关的任何内容,甚至在他们的 github 存储库中也找不到。
  • @gnebehay,你是对的,谢谢。我已经更新了我的答案。
【解决方案3】:

简单的方法 - 2022

  • 找出从哪里加载 ipdb
  • import ipdb
  • print(ipdb.__file__)
  • 从该文件夹打开__main__.py
  • 搜索except (configparser.NoSectionError, configparser.NoOptionError):
  • 下面是 3. 将其更改为您想要的值

为什么这比正确的方法更好:

  • 我不需要学习新的配置语言
  • 我不需要创建新的配置文件
  • 我不需要调试为什么我的配置文件没有被拾取
  • 您永远不会被文件范围/权限/可见性所欺骗,因为您确定正在加载哪个 ipdb 模块(即它也涵盖了 virtualenvs)
  • 我不必与上游交谈并试图说服他们采用此默认设置。

【讨论】:

  • 我在 Ubuntu 12.04 上的另一个文件中找到了我的 - /usr/lib/python2.7/dist-packages/IPython/core/debugger.py
  • 徒手编辑依赖包的内容,而不是您通常想要配置的方式..
【解决方案4】:

从 IPython 7.21 开始,您可以在 ipdb 中使用 context 命令来更改显示的回溯行数:

import ipdb; ipdb.set_trace()
...
ipdb> context 10
ipdb> bt

你可以在~/.ipdb中加入下面这行,让ipdb自动设置:

context = 10

除此之外,set_trace() 中还有旧的 context= 参数,这使得在运行调试器时可以设置它:

import ipdb; ipdb.set_trace(context=10)
# or, if you've set PYTHONBREAKPOINT=ipdb.set_trace in your environment
breakpoint(context=10)

【讨论】:

    【解决方案5】:

    编辑:已实现:https://stackoverflow.com/a/66474153/895245

    作为对this other answer 的快速补充,这是您通常要添加到要调试的代码中的一个衬里:

    __import__('ipdb').set_trace(context=21)
    

    您可能希望从编辑器中为此添加快捷方式,例如对于Vim snipmat 我有:

    snippet ipd
        __import__('ipdb').set_trace(context=21)
    

    所以我可以只输入ipd<tab>,它会扩展到断点。然后使用dd 轻松删除它,因为所有内容都包含在一行中。

    功能请求ipdb增加默认context大小:https://github.com/gotcha/ipdb/issues/147

    【讨论】:

      【解决方案6】:

      如其他人所说,如果您想在正在运行的系统中停止执行,请使用:

      ipdb.set_trace(context=number_of_lines)
      

      对于运行某些函数或对象的方法来修改此上下文行有点棘手。我找到的唯一方法是:

      ipdb.__main__._init_pdb(context=number_of_lines).runcall(callable, *args, **kwargs)
      

      如果它为某人服务。

      【讨论】:

        【解决方案7】:

        这是为您的程序永久设置上下文的补丁:

        (适用于 set_trace 和 post_mortem)

        def ipdb_patch(context = 11):
            import ipdb
            ipdbmain = ipdb.__main__
            def _init_pdb(context=context, commands=[]):
                try              : p = ipdbmain.debugger_cls(context=context)
                except TypeError : p = ipdbmain.debugger_cls()
                p.rcLines.extend(commands)
                return p
            def set_trace(frame=None, context=context):
                ipdbmain.wrap_sys_excepthook()
                if frame is None : frame = ipdbmain.sys._getframe().f_back
                p = ipdbmain._init_pdb(context).set_trace(frame)
                if p and hasattr(p, 'shell') : p.shell.restore_sys_module_state()
            ipdbmain._init_pdb = _init_pdb
            ipdb.set_trace = set_trace
            return ipdb
        ipdb = ipdb_patch()
        

        要添加断点()功能,只需添加:

        import sys
        sys.breakpointhook = ipdb.set_trace
        

        因此,以下所有命令都具有正确的上下文大小:

        ipdb.set_trace()
        breakpoint()
        ipdb.post_mortem()
        ipdb.pm()
        %debug
        

        但它不适用于此:

        In [1]: %run -d file.py
        

        如果您知道如何调整,请随时加入 cmets

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-16
          • 1970-01-01
          • 2011-10-13
          • 2014-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多