将PDB断点放入Python代码的更简单方法?


105

只是一个方便的问题。我对诸如Visual Studio和XCode之类的IDE中的调试器非常满意。我发现必须键入import pdb; pdb.set_trace()设置断点有点笨拙(我宁愿不要将pdb导入文件的顶部,因为我可能会忘记并将其保留在里面)。

是否有更简单的方法在Python代码中设置断点,就像在IDE中看到的那样简单明了?


使用PyCharm。除了使用Python IDE进行运行之外,它比输入断点行还简单吗?
西罗Santilli郝海东冠状病六四事件法轮功

只需使用python -m pdb <your_script>.py then b <line_number>即可在选定的行号处设置断点(无功能括号)。点击c继续至断点。您可以单独使用bcommand 查看所有断点。键入help以查看调试时可用的其他pdb命令。
arcseldon '19

1
从Python 3.7开始,您现在可以使用内置breakpoint()函数。python.org/dev/peps/pep-0553
Daniel

Answers:


117

您可以pdb通过以下方式从命令行运行程序

python -m pdb your_script.py

它将在第一行中断,然后您可以使用以下break命令在代码中的任意位置添加断点,其语法为:

b(reak)[[文件名:] lineno | 功能[,条件]]

它足够灵活,可以让您在任何地方添加断点。


24
为了澄清这一点,如果我pdb.set_trace()进入调试器,请使用l命令(列表),然后查看要在第27行设置断点,然后输入: b 27调试器将在第27行设置断点(我发现该文档在理解上有些挑战,因此想补充一点。
benjaminmgross 2013年

9
另外,如果您有一个对象x,并且想要在f调用其方法时停止,则可以说break x.f,然后说c(ontinue)。即使该对象位于不可访问的文件中或是动态创建的(例如通过解腌)也可以使用。
osa 2014年

2
在堆栈跟踪之后进行调试时,您可以将完整路径复制到模块,并添加行号,例如b /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596
有效

58

您可以使用:

from pdb import set_trace as bp

code
code
bp()
code
code

不知道为什么要使用多余的别名,而是;-)。由于某种原因,我的IDE / Editor(vscode)成为了此AM的母马,并且不断强调。看到您的评论确实对我有所帮助。祝你有美好的一天!
MrMesees

非常感谢!
停泊

如何set_trace仅在使用bp()时强制导入?
阿尔珀

39

在vim中,我为此设置了一个宏(在我的.vimrc文件中):

map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

所以我可以按\ b(不在插入模式下),然后在当前行之后添加一个断点,或者在\ B(注意大写)处添加一个断点,并将它放在当前行之前。

这似乎工作正常。其他大多数“简单”的程序员编辑器(emacs,sublimetext等)也应具有类似的简便方法。

编辑: 我实际上有:

au FileType python map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
au FileType python map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

仅针对python源文件将其打开。您可以非常轻松地为javascript或您使用的任何其他语言添加类似的行。

2019更新(Python 3.7+)

Python 3.7+现在具有内置功能breakpoint(),可以代替import pdb; pdb.set_trace()vim中的先前功能。它仍然起作用。


2
好的解决方案,如果您set autoindent.vimrc文件中包含缩进,则添加的行也将具有正确的缩进。
Jealie 2014年

是的,我不明白为什么大多数发行版都不附带set autoindent(以及许多其他选项)作为标准。我对新系统所做的第一件事就是引入更好的vimrc ...
Daniel Daniel

1
只需使用一个名为register的vim!保存要缓冲“d”(如线d按ebug) "dyy,只要你需要它只是做"dp"dP。学习vim寄存器!它们非常有用,并且始终受到支持!
polvoazul 2014年

之后如何添加:w?
ji-ruh

进一步介绍命名寄存器的概念,您可以记录一个宏,执行必要的操作,然后停止该宏。然后将宏内容粘贴到vimrc文件中。例如,以开始宏qd,然后"dp粘贴。最后,将您的指令分配给一个寄存器,以便始终在vim加载时进行填充。示例:let @d = 'oimport pdb; pdb.set_trace()k0:w' 现在,只要@d将行粘贴到文件中就可以使用。上面还保存了文件。但是,由于涉及特殊字符(用于转义等),因此您必须记录自己的(而不是上面的复制/粘贴)。
arcseldon

27

如果您不想每次运行程序时都手动设置断点(在Python 3.2+中),例如说您想直接在第3行创建一个断点并在此处停止执行:

python -m pdb -c "b 3" -c c your_script.py

以下信息可能会有所帮助:

如果文件.pdbrc在用户的主目录或当前目录中存在,则将其读入并执行,就像在调试器提示符下键入该文件一样。这对于别名特别有用。如果两个文件都存在,则首先读取主目录中的文件,并且本地文件可以覆盖其中定义的别名。

在版本3.2中进行了更改:.pdbrc现在可以包含继续调试的命令,例如continue或next。以前,这些命令无效。

3.2版中的新增功能:pdb.py现在接受-c选项,该选项执行命令的方式就像在.pdbrc文件中给出的一样,请参阅调试器命令。



10

这是您在命令行中使用pdb而不在源代码中执行任何操作的方式(文档和其他在线资源不能很好地向过去仅使用可视调试器的程序员解释这一点):

通过在shell提示符下键入以下内容来启动pdb:

python -m pdb 'python_script'

此命令将初始化pdb,并且pdb调试器将在python_script的第一行中断,并等待您的输入:

(Pdb)

这是与调试器进行通信的接口。现在,您可以在此处指定命令。与在视觉调试器中使用按钮或键盘快捷键相反,此处将使用命令来获得相同的结果。

您可以通过命令“ n”转到下一行代码(下一个):

(Pdb) n

执行下一步将显示行号以及源代码中的特定代码:

> python_script(line number)method name
-> current line in the source code

您可以通过在源代码中指定行号来设置断点。

(Pdb) b 50

在这里,调试器设置为在第50行中断。如果没有其他任何断点,则第50行的断点将是第一个,在这种情况下,断点ID可以引用该断点。如果您添加更多的断点,它们将依次获得标识符(即2、3等)

设置断点后,您将继续执行程序,直到pdb到达断点,如下所示:

(Pdb) c

一旦到达断点,就可以使用前面所述的n命令转到下一行。如果要检查变量的值,则可以按如下所示执行parameter命令:

(Pdb) p variable_name

如果您不再需要断点,则可以通过使用clear命令传递断点的ID来清除它:

(Pdb) clear 1

最后,完成调试器后,您可以退出执行,就像退出python命令行解释器一样。

(Pdb) exit()

我希望这可以帮助任何人开始使用pdb。这是可以与调试器一起使用的命令列表:pdb so问题与解答



4

您可以使用支持python调试的IDE,或者可以查看出色的Winpdb工具。它可以在任何平台上运行,并为python脚本提供图形化调试功能。

http://winpdb.org/


2

您可以使用:

  • 翼翼
  • 用pydev插件蚀
  • pycharms

以上所有功能都支持从IDE内部进行python调试。


0

在Atom(如果安装了Python插件)中,您只需输入“pdb '并按Enter,该代码段将为您键入import和trace back。

我已经习惯了这一点,即使我在vim中编辑它并等待下拉菜单出现,有时也只是键入它。


0

一种被低估的方法是直接在pdb中设置断点:

pdb> b torch/__init__:10

将在 site-packages\torch\__init__.py:10

然后pdb> c将在此断点处停止。

以下内容也有效:

pdb> b d:\anaconda\lib\site-packages\torch\__init__.py:10
pdb> b torch\__init__.py:10
pdb> b d:\\anaconda\\lib\\site-packages\\torch\\__init__.py:10
pdb> b d:/anaconda/lib/site-packages/torch/__init__.py:10

有关详细信息,请参见文档


0

您可以将Vim与Python-Mode插件一起使用,或者将Emacs与Elpy插件一起使用。

这些插件可通过简单的击键(\ b在Vim和C-c C-u bEmacs中)为您提供断点,以及重量级IDE的许多其他功能(代码折叠,重构,整理等),所有这些都在基于终端的轻量级文本编辑器中完成。


-1

在脚本上运行调试器的最简单方法是

pdb your_script.py

在Linux命令行上运行pdb

usage: pdb.py scriptfile [arg] ...

如何安装pdb?还是从哪里来的?
kenorb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.