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

vlju58qv  于 7个月前  发布在  其他
关注(0)|答案(8)|浏览(98)

默认情况下,在IPython中调试期间,ipdb显示代码中当前位置的上下一行。
有没有一个简单的方法可以让显示的区域更大一些?我想这是可以配置的,但是我没有找到。

kmb7vmvb

kmb7vmvb1#

您可以在ipdb中输入l以显示当前上下文的更多行
你可以继续点击l,它会继续显示文件中的更多行
如果你想在当前行周围显示更多的上下文行,你可以输入l来获得当前行。然后输入l curr_line - 10, curr_line + 10。假设我在第50行,我想看到周围的20行。我会输入:l 40,60来查看更多。
正如@jrieke在评论中所指出的,你也可以点击ll来获得更大的上下文块。ll的一个好处是它会从当前方法的开始一直打印(而连续的l s会显示断点下面的更多行)。

uttx8gqw

uttx8gqw2#

编辑:这个答案有点过时了,请看@ Baej Michalik的答案。
您可以通过以下操作获得更多上下文:

ipdb.set_trace(context=21)

字符串

永久上下文大小

要永久设置上下文大小,请执行以下操作查找安装目录

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


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

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


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

ux6nzvsh

ux6nzvsh3#

简单的方法来做到这一点- 2022年

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

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

  • 我不需要学习新的配置语言
  • 我不需要创建一个新的文件
  • 我不需要调试为什么我的网络文件没有被拾取
  • 你永远不会被文件范围/权限/可见性欺骗,因为你确定哪个ipdb模块正在加载(即它也包括virtualenvs)
  • 我不需要和上游沟通,说服他们采用这个默认值。
umuewwlo

umuewwlo4#

您可以在~/.ipdb中放置以下行,以使ipdb自动设置它:

context = 10

字符串
如果你想拥有一个基于你的shell配置的持久设置,你也可以使用IPDB_CONTEXT_SIZE变量。将以下内容添加到你的~/.bashrc/~/.zshrc/etc中:

export IPDB_CONTEXT_SIZE=10

  • 感谢N1ngu指出这一点。*

但是请记住,这是在ipdb本身中实现的,而不是在IPython中实现的,所以虽然它在与ipdb.set_trace()一起使用时可以工作,但它不适用于%debug魔术。
从IPython 7.21开始,您还可以在ipdb中使用context命令来更改显示的回溯行数:

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


x1c 0d1x的数据
除此之外,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)

k3bvogb1

k3bvogb15#

编辑:已实现:https://stackoverflow.com/a/66474153/895245
作为对this other answer的快速补充,这是您通常希望添加到要调试的代码中的一个liner:

__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

cnjp1d6j

cnjp1d6j6#

这里有一个补丁,可以永久设置程序的上下文:
(适用于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


如果你知道如何调整,请随时发表评论

9lowa7mx

9lowa7mx7#

如果你想停止运行系统中的执行,就像其他人说的,用途:

ipdb.set_trace(context=number_of_lines)

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

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


万一它能帮上什么忙。

huwehgph

huwehgph8#

按照@erock618的方式,在最近的ipdb版本中,您可以使用:用途:

debugger_cls = ipdb.__main__._get_debugger_cls()

字符串

相关问题