如何在调试时让ipdb显示更多上下文行?

时间:2011-06-05 03:46:11

标签: python debugging ipython

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

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

7 个答案:

答案 0 :(得分:38)

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

你可以继续点击l并继续显示文件中的更多行

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

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

答案 1 :(得分:14)

您可以通过以下方式获得更多背景信息:

ipdb.set_trace(context=21)

(0.10.0中引入的a bug打破了这一点,但应尽快修复)

永久上下文大小

要永久设置上下文大小,请执行

查找安装目录
python -c 'import ipdb; print(ipdb)'

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

中找到该行)
def set_trace(frame=None, context=3):

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

答案 2 :(得分:12)

好的,我在IPython源代码中找到了这个地方。在我的安装中,它位于

.../python2.7/site-packages/ipython-0.10.2-py2.7.egg/IPython/Debugger.py:327:

改变这个:

def print_stack_entry(self,frame_lineno,prompt_prefix='\n-> ',
                      context = 3):

def print_stack_entry(self,frame_lineno,prompt_prefix='\n-> ',
                      context = 11):

太棒了!

对于IPython 4.0.1,在debugger.py中添加:

class Pdb(OldPdb):
  """Modified Pdb class, does not load readline."""

  def __init__(self,color_scheme='NoColor',completekey=None,
               stdin=None, stdout=None, context=None):
      context=20

答案 3 :(得分:3)

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

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

Screenshot of IPDB after the context command has been used

您可以在 ~/.ipdb 中添加以下行以让 ipdb 自动设置它:

context = 10

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

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

答案 4 :(得分:1)

作为对https://stackoverflow.com/a/35883288/895245的快速补充,这通常是您要添加到要调试的代码中的一个衬里:

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

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

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

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

答案 5 :(得分:1)

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

(适用于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()

要添加breakpoint()功能,只需添加:

import sys
sys.breakpointhook = ipdb.set_trace

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

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

但是它不适用于此

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

如果您知道如何进行调整,请随时发表评论

答案 6 :(得分:0)

如果要停止正在运行的系统中的执行(如其他人所述),请使用:

ipdb.set_trace(context=number_of_lines)

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

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

万一它服务于某人。