1
xsaps 2013-03-01 14:43:22 +08:00
应该是pdb.set_trace()调用的问题
这样有同样的问题 <pre> import pdb pdb.set_trace() print 'hello' </pre> 这样next就没有异常 <pre> import pdb def foo(): pdb.set_trace() print 'hello' pdb.run('foo()') </pre> |
2
lvii OP https://gist.github.com/lvii/5087791
@xsaps 兄,我试了 pdb.run('foo()') 调试到后面 16 -> pdb.run('foo()') 17 [EOF] (Pdb) n > <string>(1)<module>() (Pdb) l [EOF] (Pdb) n --Return-- > <string>(1)<module>()->None (Pdb) l [EOF] (Pdb) n ## 退出,无异常 但是,如果按 'q' 退出,还是会有异常的。pdb.run(...) 是在交互式 shell 中启用 pdb 貌似 对你的回复,原理还不识很明白,还请继续抛玉 :) |
3
lvii OP |
4
lvii OP <script src="http://gist.github.com/lvii/5087791"> </script>
|
5
lvii OP |
6
lvii OP |
7
lvii OP 怎么插入 gist 代码呢 …… 测试了几个,咋都不行 ……
|
8
xsaps 2013-03-05 22:28:33 +08:00
@lvii 哎呀我也是Python新手, 个人觉得这是个BUG, 而且感觉是个坑, 而且我太懒了, 不想深入研究...你懂的. 有几个问题
1. 看gist你用的是Linux环境? 我用的是Windows, python 2.7.3, 可能有所不同, 我这里放到pdb.run里面后, 按'q'退出没有异常. 不放到pdb.run()里, 按'q'退出异常, 但是用python -m pdb同样按'q'退出也没有异常. 2. 我看gist里提到的issue16446里的patch, 做的事大概是保存了一个trace前的frame, 退出调试的时候还原那个frame, 所以我猜测set_trace调用的时候是会改动程序执行上下文的一些东东的, 退出的时候没还原, 就异常了. 但是放到pdb.run里面, 可能run函数会做一些清理(或者说把异常捕捉并处理了?), 具体我就不清楚了... 3. 我还遇到一个类似的问题, 就是不论用不用pdb.run(), 进入pdb交互状态后, 执行run命令重新调试程序, 会抛出一个Restart异常. 但是用python -m pdb就没这个问题. 具体原因就没有深究了... 如果有啥新发现欢迎分享. |
9
binux 2013-03-05 22:34:10 +08:00
按c
|