我有一个wsgi应用程序在代码中有这个:
import rpdb2; rpdb2.start_embedded_debugger("asdf")
Run Code Online (Sandbox Code Playgroud)
现在使用rpdb2(而不是winpdb!)我想连接到进程并开始调试.
我无法弄清楚如何做到这一点.如何连接到正在运行的进程或如何使该进程连接到调试器?
我正在使用pdb来调试程序.我先后点击'c'来运行代码,每一步pdb都显示我执行了哪一行.
假设我们有这个代码:
def foo(bar):
print(bar)
foo('hey')
Run Code Online (Sandbox Code Playgroud)
首先,第4行调用函数foo.然后pdb告诉我这一行
def foo(bar)
Run Code Online (Sandbox Code Playgroud)
被执行.
为什么?这条线不仅仅是一种标签吗?执行"print(bar)"之前会发生什么?(伴随着另一个人的打击)
编辑:我试验做的事情是实际检查定义.事实上,在案件foo为发生器(即不能以这样的方式被称为)蟒蛇仍到那里,然后决定把它当作一台发电机(或根据情况的功能.).
我想拥有pdb的交互性,但是还需要使用python的帮助功能来内省我不熟悉的对象/方法。
如何从pdb使用python的help()?
我尝试的一切都给了我:
(Pdb) help(help)
*** No help on (help)
(Pdb) help(list())
*** No help on (list())
Run Code Online (Sandbox Code Playgroud) 我想了解如何__enter__和__exit__方法被调用文件上下文管理。
with open("test.txt") as fp:
fp.read()
Run Code Online (Sandbox Code Playgroud)
我step在 pdb 中尝试过命令 - 而不是去定义函数open,它只是执行它并移动到下一行。
我尝试使用sys.settrace()过,但即使没有捕捉到的函数调用open,__enter__和__exit__在任何事件。
当然,这适用于从其他模块和同一模块中导入的函数。我假设这应该以类似的方式适用于这些开箱即用的内置函数。我找不到任何指向此的文档。是否可以单步执行或跟踪内置函数的执行?
使用 Python 2.7。
在一个大型项目中,我遇到了一个非常慢的功能(说到几秒到几分钟的执行时间)。该函数可以完成很多事情,并且具有非常深的堆栈跟踪。尽管此函数的执行只涉及几个类,但是长运行时间的来源并不太明显。
我开始调试该功能,跟踪调用等,并发现跟踪包非常有用。有了这个,我可以确定一些函数,这些函数会一遍又一遍地汇编列表,实际上,在第一次执行后保存列表时,实际上导致了大约3倍的加速。
但是现在我真的看不到任何更明显的部分,因为跟踪包产生了几兆字节的文本,因此可以优化功能的地方,而且我看不到任何对我来说可疑的东西。
我考虑过使用跟踪的计时选项,以便为我提供一些有关运行时的概述,以查看哪些功能可能很慢-但是数据量太大,因此总的执行时间为列出了每个调用,但是跟踪软件包似乎不支持此调用吗?
另一个问题是,我想在哪个级别获得执行时间。相反,不是单个语句很慢,而是经常调用整个函数或不保存数据的情况。因此,我最终需要的是每个语句的平均执行时间乘以计数。后者可以由跟踪包生成。
除了pdb和trace之外,最终是否还有其他工具可以使用?
我发现在大型多层软件中,通过将以下内容放入代码中通常更容易调试 python 代码。
import pdb; pdb.set_trace()这在我放置语句的 LOC 处设置了一个断点,我可以在代码中以交互方式使用 pdb 继续并检查代码执行等。
我想知道是否可以为此类 python 调试添加多个断点,以便我可以c在交互式 python 调试器中执行并命中下一个断点?
即例如
<python code>
import pdb; pdb.set_trace();
... interactive debugging....
...press c here....
<more python code>
...
....
<breakpoint>// How can we insert such a breakpoint?
Run Code Online (Sandbox Code Playgroud) 简单但可能很明显但不适合我们:当命令有相同的名称变量时,
使用pdb快捷方式会变得烦人,因此,如何删除pdb中的所有密钥快捷方式?我们使用pdb的spyder,顺便说一句.
>>> p = 1
Run Code Online (Sandbox Code Playgroud)
虽然p我们对变量感兴趣,但在尝试调试时,上面显示为命令(abr.用于打印)!混乱!
在python调试器或django shell中创建一行for循环很容易:
>>>> for x in (1,2,3,4):print(x);
>>>> for x in Obj.objects.all():something(x);
Run Code Online (Sandbox Code Playgroud)
但是我怎么能在那里得到第二个for循环呢?
>>>> for x in (1,2,3,4):print x;for y in (5,6):print x,y;
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
我很在意,因为在交互式工作时对前一个命令进行向上箭头编辑很好(这不是尝试在任何其他上下文中使用单行命令).
注意:"打印"只是一个例子.在实际使用中,我会迭代对象或执行其他编程或调试任务,例如'for s in Section.objects.all():for s in s.children():print j'.我使用的是Python 2.7.
我正在尝试学习如何使用ipdb调试器.我插入一个断点,然后输入continue我从一个断点前进到另一个断点.如果我想打印变量的值一段时间我在两个断点之间执行的一半,我怎么能用ipdb/pdb做这个?我试过print和pprint但没有出现.

下面是简单的单元测试。
如果我在不使用“ test”作为参数的情况下运行它(例如python -m unittest module_name),它将通过。如果以“ test”作为参数运行它,则会收到“ TypeError:内置操作的错误参数类型”。为什么?
from io import StringIO
import sys
from unittest import TestCase
class TestSimple(TestCase):
def test_simple(self):
old_stdout = sys.stdout
buf = StringIO()
try:
sys.stdout = buf
print('hi')
finally:
import pdb
if 'test' in sys.argv:
pdb.set_trace()
sys.stdout = old_stdout
Run Code Online (Sandbox Code Playgroud)
contextlib.redirect_stdout版本:
from contextlib import redirect_stdout
from io import StringIO
import pdb
import sys
from unittest import TestCase
class TestSimple(TestCase):
def test_simple(self):
buf = StringIO()
with redirect_stdout(buf):
print('hi')
pdb.set_trace()
print('finis')
Run Code Online (Sandbox Code Playgroud)
提前致谢。
编辑: 原始程序已在Debian和Windows 7中的Python 3.4中进行了测试。
类似的东西(使用环境标志而不是命令行参数)似乎在Python 2中挂起,但是按c可以完成它,所以我猜测可能是pdb的UI已被重定向。但是Python …
pdb ×10
python ×10
debugging ×2
django-shell ×1
ipython ×1
python-2.7 ×1
python-3.x ×1
shortcuts ×1
spyder ×1
trace ×1
winpdb ×1