【问题标题】:ipdb / set_trace() bug on Windows?Windows 上的 ipdb / set_trace() 错误?
【发布时间】:2015-08-16 15:03:48
【问题描述】:

在运行 python 脚本并使用 ipdb 设置断点时,我得到了一个非常奇怪的输出,就像在这个程序中一样:

import sys
import ipdb
parents, babies = (1, 1)
while babies < 100:
    ipdb.set_trace()
    print 'This generation has {0} babies'.format(babies)
    ipdb.set_trace()
    parents, babies = (babies, parents + babies)

最初运行脚本时一切正常,在第一个断点处停止并打印所有变量。但是一旦我接近第二个断点,不管我是单步执行还是继续,我都会在控制台中得到这些奇怪的字符作为输出:

C:\pythontest>python ipdb_test2.py
> c:\pythontest\ipdb_test2.py(6)<module>()
      5         ipdb.set_trace()
----> 6         print 'This generation has {0} babies'.format(babies)
      7         ipdb.set_trace()

ipdb> n
This generation has 1 babies
> c:\pythontest\ipdb_test2.py(7)<module>()
      6         print 'This generation has {0} babies'.format(babies)
----> 7         ipdb.set_trace()
      8         parents, babies = (babies, parents + babies)

ipdb> n
> ←[1;32mc:\pythontest\ipdb_test2.py←[0m(8)←[0;36m<module>←[1;34m()←[0m
←[1;32m      6 ←[1;33m        ←[1;32mprint←[0m ←[1;34m'This generation has {0} b
abies'←[0m←[1;33m.←[0m←[0mformat←[0m←[1;33m(←[0m←[0mbabies←[0m←[1;33m)←[0m←[1;33
m←[0m←[0m
←[0m←[1;32m      7 ←[1;33m        ←[0mipdb←[0m←[1;33m.←[0m←[0mset_trace←[0m←[1;3
3m(←[0m←[1;33m)←[0m←[1;33m←[0m←[0m
←[0m←[1;32m----> 8 ←[1;33m        ←[0mparents←[0m←[1;33m,←[0m ←[0mbabies←[0m ←[1
;33m=←[0m ←[1;33m(←[0m←[0mbabies←[0m←[1;33m,←[0m ←[0mparents←[0m ←[1;33m+←[0m ←[
0mbabies←[0m←[1;33m)←[0m←[1;33m←[0m←[0m
←[0m
ipdb> n
> ←[1;32mc:\pythontest\ipdb_test2.py←[0m(4)←[0;36m<module>←[1;34m()←[0m
←[1;32m      3 ←[1;33m←[0mparents←[0m←[1;33m,←[0m ←[0mbabies←[0m ←[1;33m=←[0m ←[
1;33m(←[0m←[1;36m1←[0m←[1;33m,←[0m ←[1;36m1←[0m←[1;33m)←[0m←[1;33m←[0m←[0m
←[0m←[1;32m----> 4 ←[1;33m←[1;32mwhile←[0m ←[0mbabies←[0m ←[1;33m<←[0m ←[1;36m10
0←[0m←[1;33m:←[0m←[1;33m←[0m←[0m
←[0m←[1;32m      5 ←[1;33m        ←[0mipdb←[0m←[1;33m.←[0m←[0mset_trace←[0m←[1;3
3m(←[0m←[1;33m)←[0m←[1;33m←[0m←[0m
←[0m
ipdb>

当我第二次点击 ipdb.set_trace() 命令时,它会输出这些字符,从那时起调试器就无法使用了。我在不同的控制台上尝试过,但错误似乎仍然存在。

我在 Windows 上使用 Python 2.7.8 和 Anaconda 2.1.0(64 位),热烈欢迎任何解决此问题的想法。

【问题讨论】:

  • 您使用 ipdb 有什么原因吗? pdb 对我来说很好。
  • 是的,但是朋友向我推荐了 ipdb,以使其更加通用。我也更喜欢 ipdb 的默认颜色而不是 pdb 的纯黑白输出,pdb 也没有任何意图。它在调用“python -m ipdb ipdb_test2.py”并交互式设置断点时确实有效。我觉得这有点麻烦

标签: python ipdb


【解决方案1】:

奇怪的输出是ANSI escape codes。这就是 ipdb 进行语法高亮的方式。但是默认情况下,CMD 窗口不支持转义码,从 DOS 时代开始就是这样。您必须启用一个名为 ANSI.SYS 的特殊驱动程序才能使控制代码工作。 ipdb 一定是在使用某种魔法,在您第二次调用 set_trace() 时会中断。

【讨论】:

  • 非常感谢您的回答!但是在Wikipedia 上,它说从 Windows 7 开始不再存在 ANSI.SYS 文件。现在在 Windows 10 上我也不再遇到此错误。我不太确定这是否仅仅是因为操作系统更改,但我认为我没有更改任何其他配置。
  • 无论如何,您的回答很有帮助,因为问题是关于 ANSI 转义码,现在 Windows 10 的 Win32 控制台中首次支持这些转义码(根据您的维基百科链接)。在以前的 Windows 版本中,您需要手动启用此驱动程序。再次感谢:-)
【解决方案2】:

使用ipdb(以及据我所知pdb)的正常方法是在代码中只设置一个import ipdb; ipdb.set_trace() 命令,以便进入调试器。从那里您可以设置其他断点,使用break or b command,然后按continuec 到达该断点。以这个简单的pdb 会话为例:

➜  python  python hello.py
hello
> /Users/kermit/Dropbox/dev/skripte/python/hello.py(4)<module>()
-> print('hello 2')
(Pdb) l
  1     print('hello')
  2     import pdb; pdb.set_trace()
  3
  4  -> print('hello 2')
  5     print('hello 3')
[EOF]
(Pdb) b 5
Breakpoint 1 at /Users/kermit/Dropbox/dev/skripte/python/hello.py:5
(Pdb) c
hello 2
> /Users/kermit/Dropbox/dev/skripte/python/hello.py(5)<module>()
-> print('hello 3')
(Pdb)

【讨论】:

  • 好吧,当然可以。但是如果我想在循环中设置断点并在每次迭代中检查变量的值怎么办?然后,当我在循环中插入import ipdb; ipdb.set_trace() 行时,我遇到了同样的问题,因为我第二次接近该行。我知道 pdb 不会出现问题,但我真的更喜欢 ipdb 的输出样式
  • 那么我要做的就是在循环之前插入import ipdb; ipdb.set_trace(),一旦在调试器内部使用break 命令动态插入另一个断点,该断点在循环内,然后@987654334 @ 随意检查每次迭代的状态。
  • 好的,这是一个很好的解决方法。我现在将继续像这样使用 ipdb,但仍然对导致此输出的实际原因感兴趣,这似乎是 ipdb 特定的。当我有更多时间时,我会进一步研究这个问题。
猜你喜欢
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 2014-05-30
  • 2016-04-15
相关资源
最近更新 更多