จะออกจาก pdb และอนุญาตให้โปรแกรมดำเนินการต่อได้อย่างไร


111

ฉันใช้โมดูล pdb เพื่อดีบักโปรแกรม ฉันต้องการทำความเข้าใจว่าฉันจะออกจาก pdb ได้อย่างไรและอนุญาตให้โปรแกรมดำเนินการต่อไปจนเสร็จสิ้น โปรแกรมมีค่าใช้จ่ายในการคำนวณสูงดังนั้นฉันจึงไม่ต้องการออกโดยที่สคริปต์ไม่พยายามทำให้เสร็จสมบูรณ์ continueดูเหมือนจะไม่ทำงาน ฉันจะออกจาก pdb และดำเนินการต่อกับโปรแกรมของฉันได้อย่างไร


2
continueออกจากลูปreturnออกจากวิธีการ / ฟังก์ชัน
Stephan

7
@Stephan: เขาพูดถึงcontinueคำสั่ง pdb ไม่ใช่คำสั่ง Python
voithos

1
@turtle: continueควร "ดำเนินการต่อ แต่จะหยุดเมื่อพบจุดพักเท่านั้น" ตามเอกสาร คุณมีชุดเบรกพอยต์ที่ถูกโจมตีหรือไม่?
voithos

1
อา. ตกลงฉันเห็น ใช่ฉันมีจุดพักตั้งอยู่ในลูป ต่อไปเพื่อหลีกเลี่ยงสิ่งนี้? ลูปถูกเรียกหลายพันครั้งดังนั้นฉันจึงไม่สามารถกดปุ่มต่อไปได้ด้วยตนเอง
เต่า

1
@ เต่า: คุณมีจุดพักจากภายใน Pdb หรือคุณมีpdb.set_trace()ซอร์สโค้ดหรือไม่?
voithos

คำตอบ:


190

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!

10
ข้างต้นไม่ได้ออกจาก pdb
Steve Barnes

7
เกี่ยวกับคำถามคำที่ 15!
Steve Barnes

13
@SteveBarnes: ฉันคิดว่าคุณใช้มันเกินไปจริงๆ OP กำลังกดปุ่มเบรกพอยต์ซ้ำแล้วซ้ำเล่า สิ่งที่พวกเขาต้องการคือดำเนินกระบวนการที่ใช้งานได้ยาวนานต่อไปโดยไม่ต้องกดปุ่มเบรกพอยท์ Pdb ทำงานจริงหรือไม่นั้นไม่สำคัญ
voithos

35
เคล็ดลับที่ดีในการตั้งค่าset_trace = lambda: None:)
randlet

2
set_trace = lambda: Noneสำหรับกรณีที่รุนแรงเต้นอะไร Python org ควรเพิ่มคำสั่งที่ช่วยให้คุณออกจาก pdb ได้
ErezO

26

ง่ายCtrl- Dจะแตกออกจาก pdb หากคุณต้องการดำเนินการต่อแทนที่จะทำลายเพียงแค่กดcแทนcontinueคำสั่งทั้งหมด


7
แล้วเมื่อคุณอยู่ในฟังก์ชันภายในลูปล่ะ? ดูเหมือนว่าจะไปที่ลูปถัดไปสำหรับฉันและฉันไม่สามารถปิด pdb หรือแม้แต่ปิด python ได้โดยไม่ต้องปิดเทอร์มินัลทั้งหมด?
Marses

@LimokPalantaemon แปลกคุณลองพิมพ์แล้วหรือยังexit
Minh Triet

วิธีนี้ใช้ไม่ได้หากคุณตั้งค่าการติดตามหรือหากคุณมีจุดพักเว้นแต่คุณจะกด c ต่อไป
Alex

ทำให้ตกใจ แต่สิ่งนี้ช่วยให้ฉันไม่ติดอยู่นานเกินไป -_-
jmcg

7

คำตอบจาก @voithos set_traceถูกต้องดังนั้นฉันจะเพิ่มอีกหนึ่งทางเลือกในกรณีที่คุณกำลังใช้ ใช่การpdb.set_trace = lambda: Noneแฮ็กทำงานได้ดี แต่ไม่ใช่หากคุณตั้งค่าเบรกพอยต์อื่นไว้และต้องการเปิดใช้งานอีกครั้งในภายหลัง สำหรับฉันแล้วสิ่งนี้ชี้ให้เห็นถึงความจริงที่ว่าน่าเสียดายที่pdbไม่มีฟังก์ชันมากมาย (แม้แต่สิ่งพื้นฐานเช่นรายการที่แสดง) และนี่ก็เป็นอีกกรณีหนึ่ง

ข่าวดีก็คือว่าpdb++เป็นดรอปแทนสำหรับการที่ดีและเป็นหนึ่งในสิ่งที่มันแก้เป็นว่าปัญหาของการปิดการใช้งานpdb set_traceดังนั้นคุณสามารถทำได้:

pip install pdbpp

จากนั้นที่(Pdb++)พรอมต์พิมพ์:

pdb.disable()

หากคุณต้องการเปิดใช้งานอีกครั้งในภายหลังสิ่งนี้ไม่น่าแปลกใจเลย:

pdb.enable()

ง่าย! และคุณจะได้รับสินค้าที่มีประโยชน์อื่น ๆ อีกมากมาย


4

หากคุณต้องการออกจากดีบักเกอร์จริงๆคุณต้องเรียกใช้บางอย่างเช่นWinPdbซึ่งช่วยให้คุณสามารถแยกออกจากกระบวนการแล้วออกจากดีบักเกอร์ (NB เป็นหลายแพลตฟอร์ม)

หากคุณต้องการแก้ไขข้อบกพร่องต่อไป แต่ไม่หยุดที่จุดพักที่กำหนดอีกต่อไปคุณต้อง:

  1. จดบันทึกหมายเลขเบรกพอยต์ (หรือไฟล์และหมายเลขบรรทัด)
  2. อย่างใดอย่างหนึ่งcl bp_number หรือ clear file:lineเพื่อลบเบรกพอยต์อย่างถาวรหรือ disable pb_numberเพื่อปิดใช้งาน แต่สามารถสลับกลับได้
  3. จากนั้นcontinueและโปรแกรมของคุณจะทำงานจนกว่าจะถึงจุดพักที่แตกต่างกัน

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการดังกล่าวข้างต้นดูคู่มือการใช้งาน


0

หาวิธีใหม่ในการออกจาก pdb โดยไม่ต้องติดตั้งอะไรเลย: - เมื่อโปรแกรมเริ่มทำงานให้กด ctrl + c จากนั้นสลับหน้าต่างไปที่หน้าต่างอื่น (หน้าต่างใดก็ได้) จากนั้นเชลล์เดิมที่รัน pdb ควรแสดงสิ่งที่ต้องการ: (pdb) ..... - เปลี่ยนกลับเป็น pdb จากนั้นกด Enter ตอนนี้คุณพร้อมแล้วเชลล์คำสั่ง pdb จะปรากฏขึ้นอีกครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.