python ipdb偶尔不显示代码行

python ipdb偶尔不显示代码行,python,debugging,ipython,ipdb,Python,Debugging,Ipython,Ipdb,使用中断python代码的执行 import ipdb; ipdb.set_trace() 有时(但并非总是)将我放入ipdb而不显示周围的代码行,即使我发出l命令。我得到的是 > /path/to/file.py(58)main() ipdb> 而不是 > /path/to/file.py(58)main() -> print('hello 2') 55 print('hello') 56 import pdb; pdb.set_trace(

使用中断python代码的执行

import ipdb; ipdb.set_trace()
有时(但并非总是)将我放入ipdb而不显示周围的代码行,即使我发出
l
命令。我得到的是

> /path/to/file.py(58)main()
ipdb>
而不是

> /path/to/file.py(58)main()
-> print('hello 2')
  55     print('hello')
  56     import pdb; pdb.set_trace()
  57
  58  -> print('hello 2')
  59     print('hello 3')
ipdb>
有人知道如何显示代码行吗


编辑:如果我
s
tep进入一个新函数(位于另一个文件中),每边都会出现一个单独的包围线。

ipdb
是股票python调试器的包装,因此在
ipdb
不能显示行号的情况下,
pdb
也不能显示行号

pdb
从python模块获取其源文本。有各种各样的东西可以衬托它。最明显的情况是没有源文件

如果正在计算字符串,则会发生这种情况。例如,可能在<代码> EVE(“X+ 1”)或<代码> Excel(“z=1+2”)< /COD>

沿着相同的行,您可能已经通过<代码> Exc< /COD>定义了函数,而现在您正处于运行该函数的中间。例如:

exec("def five(): return 5")
five()
在这种情况下,您可以通过调整堆栈帧并查看调用上下文来判断您的情况。因此,当发生这种情况时,运行
up
bt
(回溯):

如果你看到:

 (Pdb) up
> <string>(1)<module>()
现在我们运行调试器:

$ trepan3k /tmp/foo.py
(/tmp/foo.py:1): <module>
-> 1 x = 3
(trepan3k) step
(/tmp/foo.py:2 @6): <module>
-- 2 eval("x+1")

(trepan3k) step
(<string>:1): <module>
(/tmp/foo.py:2 @12): <module>
-> 2 eval("x+1")
(trepan3k) list
** No file <string> found
(trepan3k) deparse .
return x + 1
(trepan3k) step
(<string>:1 @7): <module>
(/tmp/foo.py:2 @12): <module>
<- 2 eval("x+1")
R=> 4
(trepan3k) step
(/tmp/foo.py:3 @16): <module>
-- 3 exec("z=2")
(trepan3k) list
End position changed to last line 3 
 1      x = 3
 2      eval("x+1")
 3  ->  exec("z=2")
(trepan3k) step
(<string>:1): <module>
(/tmp/foo.py:3 @22): <module>
-> 3 exec("z=2")
(trepan3k) list
** No file <string> found
(trepan3k) deparse .
z = 2
$trepan3k/tmp/foo.py
(/tmp/foo.py:1):
->1 x=3
(钻孔3K)台阶
(/tmp/foo.py:2@6):
--2评估(“x+1”)
(钻孔3K)台阶
(:1): 
(/tmp/foo.py:2@12):
->2评估(“x+1”)
(钻孔3K)列表
**找不到文件
(钻孔3K)深埋。
返回x+1
(钻孔3K)台阶
(:1 @7): 
(/tmp/foo.py:2@12):
4.
(钻孔3K)台阶
(/tmp/foo.py:3@16):
--3执行(“z=2”)
(钻孔3K)列表
结束位置更改为最后一行3
1 x=3
2评估(“x+1”)
3->exec(“z=2”)
(钻孔3K)台阶
(:1): 
(/tmp/foo.py:3@22):
->3执行(“z=2”)
(钻孔3K)列表
**找不到文件
(钻孔3K)深埋。
z=2

如果这还不够,还可以反汇编代码来查看。如果您碰巧知道python源文件的位置,但由于某种原因调试器无法单独找到它,您可以使用它告诉它源代码的位置

这也发生在我身上。但在我的例子中,“l”起作用,所以我先做“n/s”,然后再做“l”。
x = 3
eval("x+1")
exec("z=2")
$ trepan3k /tmp/foo.py
(/tmp/foo.py:1): <module>
-> 1 x = 3
(trepan3k) step
(/tmp/foo.py:2 @6): <module>
-- 2 eval("x+1")

(trepan3k) step
(<string>:1): <module>
(/tmp/foo.py:2 @12): <module>
-> 2 eval("x+1")
(trepan3k) list
** No file <string> found
(trepan3k) deparse .
return x + 1
(trepan3k) step
(<string>:1 @7): <module>
(/tmp/foo.py:2 @12): <module>
<- 2 eval("x+1")
R=> 4
(trepan3k) step
(/tmp/foo.py:3 @16): <module>
-- 3 exec("z=2")
(trepan3k) list
End position changed to last line 3 
 1      x = 3
 2      eval("x+1")
 3  ->  exec("z=2")
(trepan3k) step
(<string>:1): <module>
(/tmp/foo.py:3 @22): <module>
-> 3 exec("z=2")
(trepan3k) list
** No file <string> found
(trepan3k) deparse .
z = 2