[英]How to exit pdb and allow program to continue?
我正在使用 pdb 模塊來調試程序。 我想了解如何退出 pdb 並允許程序繼續完成。 該程序在計算上運行起來很昂貴,所以我不想在沒有腳本嘗試完成的情況下退出。 continue
似乎不起作用。 如何退出 pdb 並繼續我的程序?
continue
應該“繼續執行,僅在遇到斷點時停止”,因此您在某處設置了斷點。 要刪除斷點(如果您手動插入它):
(Pdb) break
Num Type Disp Enb Where
1 breakpoint keep yes at /path/to/test.py:5
(Pdb) clear 1
Deleted breakpoint 1
(Pdb) continue
或者,如果您使用的是pdb.set_trace()
,您可以試試這個(盡管如果您以更奇特的方式使用 pdb,這可能會破壞事情......)
(Pdb) pdb.set_trace = lambda: None # This replaces the set_trace() function!
(Pdb) continue
# No more breaks!
一個簡單的Ctrl - D將打破 pdb。 如果您想繼續而不是中斷,只需按c而不是整個continue
命令
@voithos 的答案是正確的,所以我將在您使用set_trace
的情況下添加一個替代方案。 是的, pdb.set_trace = lambda: None
hack 可以正常工作,但如果您設置了其他斷點並希望稍后重新啟用它,則不會。 對我來說,這表明不幸的是pdb
缺少一堆功能(甚至是顯示列表等基本功能),這是另一種情況。
好消息是pdb++
是pdb
的一個很好的替代品,它解決的問題之一就是禁用set_trace
的問題。 所以你可以簡單地做:
pip install pdbpp
然后在(Pdb++)
提示符下,鍵入:
pdb.disable()
如果您想稍后重新啟用,不出所料,這很有效:
pdb.enable()
簡單的! 除此之外,您還將獲得許多其他有用的好東西。
如果您在代碼中使用了breakpoint()
,則可以通過環境變量禁用所有這些斷點。
import os
os.environ['PYTHONBREAKPOINT'] = '0'
當您處於(Pdb)交互狀態時,這也有效,這將禁用插入代碼中的所有breakpoint()
,但不會禁用(Pdb)啟用的斷點。
所以讓我們測試一下,代碼在第 4 行有breakpoint()
:
> /tmp/py.py(5)<module>()
-> print(x,a)
(Pdb) ll
1
2 for x in "abcdefg":
3 a=1
4 breakpoint()
5 -> print(x,a)
6 b=2
7 print(x,b)
讓我們在第 6 行設置新的斷點。
(Pdb) break 6
Breakpoint 1 at /tmp/py.py:6
(Pdb) break
Num Type Disp Enb Where
1 breakpoint keep yes at /tmp/py.py:6
現在讓我們在第 4 行禁用所有breakpoint()
。
(Pdb) import os
(Pdb) os.environ['PYTHONBREAKPOINT'] = '0'
並繼續
(Pdb) c
a 1
> /tmp/py.py(6)<module>()
-> b=2
(Pdb) ll
1
2 for x in "abcdefg":
3 a=1
4 breakpoint()
5 print(x,a)
6 B-> b=2
7 print(x,b)
現在它在第 6 行停止並跳過第 4 行,讓我們繼續
(Pdb) c
a 2
b 1
> /tmp/py.py(6)<module>()
-> b=2
現在它再次在第 6 行停止並跳過第 4 行
(Pdb) break
Num Type Disp Enb Where
1 breakpoint keep yes at /tmp/py.py:6
(Pdb) clear 1
Deleted breakpoint 1 at /tmp/py.py:6
現在(Pdb)第 6 行的斷點被刪除,程序可以繼續工作:
(Pdb) c
b 2
c 1
c 2
d 1
d 2
e 1
e 2
f 1
f 2
g 1
g 2
找到不安裝任何東西退出 pdb 的新方法: - 當程序開始運行時,按 ctrl+c,然后將窗口切換到另一個(任何窗口),然后運行 pdb 的原始 shell 應該顯示如下內容:(pdb) ..... - 切換回 pdb,然后按 Enter,現在一切就緒,pdb 命令 shell 再次出現
禁用斷點。 從 pdb 中,只需鍵入 disable N,其中 N 是您卡住的斷點編號。 如果您不知道麻煩斷點的編號,請輸入 tbreak。 這將在“Num”列下按編號列出您的斷點,並在標題為“Enb”的列下顯示(是)或否(否)它們是啟用還是禁用。
一旦你解除了麻煩的斷點,運行命令 continue(或縮寫 c)應該會完成你的程序。
我被困在一個 pdb shell 中, Enter 只是產生^M
,所以我無法逃脫它。
經過一些科學設計的實驗,結果是ctrl+Z
牽引 pdb shell。 (然后stty sane
修復 Enter 鍵。)
然后你需要殺死或恢復 pdb shell。 為此,請運行jobs
,然后運行fg 1
或kill %1
(替換作業編號)。
我想當我下周回到這里時,我會在這里為任何其他人以及我自己記下它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.