簡體   English   中英

如何退出pdb並允許程序繼續?

[英]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()

簡單的! 除此之外,您還將獲得許多其他有用的好東西。

如果你真的想退出調試器,那么你需要運行WinPdb 之類的東西,它允許你從進程中分離然后退出調試器,(注意它是多平台的)。

如果您想繼續調試但不再在給定斷點處停止,那么您需要:

  1. 記下斷點編號(或文件和行號),
  2. cl bp_numberclear file:line永久刪除斷點disable pb_number將其關閉但能夠將其切換回來。
  3. 然后continue ,你的程序運行,直到下一個不同的斷點被命中。

有關上述內容的更多詳細信息,請參閱手冊

如果您在代碼中使用了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 1kill %1 (替換作業編號)。

我想當我下周回到這里時,我會在這里為任何其他人以及我自己記下它。

暫無
暫無

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

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