簡體   English   中英

如何繼續Python PDB中的下一個循環迭代?

[英]How to continue to the next loop iteration in Python PDB?

鑒於此示例代碼:

import pdb

for i in range(10):
  pdb.set_trace()
  print(str(i))

當我從PDB得到提示時,我怎樣才能跳過循環的迭代,使用continue循環控制語句,當它也被PDB使用時,繼續執行代碼?

您不能使用continue因為調試器中的新語句需要完整且有效而沒有任何其他上下文; 在編譯時,必須在循環結構內給出continue 因此使用!continue (使用!以防止pdb解釋命令)即使調試器正在處理循環結構也不能使用。

您可以使用j[ump]命令, 前提是您有一個以后的語句要跳轉到 如果您想要跳過的語句后循環為空,則只能“回放”:

$ bin/python test.py
> /.../test.py(5)<module>()
-> print(str(i))
(Pdb) l
  1     import pdb
  2     
  3     for i in range(10):
  4         pdb.set_trace()
  5  ->     print(str(i))
  6     
[EOF]
(Pdb) j 3
> /.../test.py(3)<module>()
-> for i in range(10):

j 3跳到第3行,沒有跳過任何東西; 第3行將被重新執行,包括設置range() 你可以跳到第4行,但是for循環不會前進。

你需要在循環結束時添加另一個語句來跳轉到Python繼續。 該聲明可以是print()pass或其他任何不必改變您的狀態的聲明。 你甚至可以使用continue作為最后一個語句。 我用過i

for i in range(10):
    pdb.set_trace()
    print(str(i))
    i  # only here to jump to.

演示:

$ bin/python test.py
> /.../test.py(5)<module>()
-> print(str(i))
(Pdb) l
  1     import pdb
  2     
  3     for i in range(10):
  4         pdb.set_trace()
  5  ->     print(str(i))
  6         i  # only here to jump to.
  7     
[EOF]
(Pdb) j 6
> /.../test.py(6)<module>()
-> i  # only here to jump to.
(Pdb) c
> /.../test.py(4)<module>()
-> pdb.set_trace()
(Pdb) s
> /.../test.py(5)<module>()
-> print(str(i))
(Pdb) j 6
> /.../test.py(6)<module>()
-> i  # only here to jump to.
(Pdb) i
1
(Pdb) c
> /.../test.py(4)<module>()
-> pdb.set_trace()
(Pdb) s
> /.../test.py(5)<module>()
-> print(str(i))
(Pdb) j 6
> /.../test.py(6)<module>()
-> i  # only here to jump to.
(Pdb) i
2

調試器命令

j( umplineno
設置將要執行的下一行。 僅適用於最底部的框架。 這使您可以跳回並再次執行代碼,或者跳轉到跳過您不想運行的代碼。

應該注意的是,並非所有跳轉都是允許的 - 例如,不可能跳轉到for循環的中間或跳出finally子句。

聽起來很奇怪。 您應該能夠使用jump命令 您可能需要在for循環結束時添加一個pass語句,以便跳轉到循環結束。 如果您不確定代碼的行號,那么您可以使用ll找出循環的行號。

> c:\run.py(5)<module>()
-> print(i)
(Pdb) ll
  1     import pdb
  2     
  3     for i in range(10):
  4         pdb.set_trace()
  5  ->     print(i)
  6         pass
(Pdb) j 6
> c:\run.py(6)<module>()
-> pass
(Pdb) c
> c:\python\run.py(4)<module>()
-> pdb.set_trace()
(Pdb) c
1
> c:\python\run.py(5)<module>()
-> print(i)

值得注意的是,跳轉到for行將重新啟動循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM