วิธีที่ง่ายกว่าในการใส่เบรกพอยต์ PDB ในโค้ด Python


108

เพียงคำถามเพื่อความสะดวก ฉันเอาแต่ใจกับดีบักเกอร์ใน IDE เช่น Visual Studio และ XCode ฉันพบว่ามันค่อนข้างงุ่มง่ามที่จะต้องพิมพ์import pdb; pdb.set_trace()เพื่อตั้งค่าเบรกพอยต์ (ฉันไม่ควรนำเข้า pdb ที่ด้านบนของไฟล์เพราะฉันอาจลืมและทิ้งไว้)

มีวิธีที่ง่ายกว่าในการตั้งค่าเบรกพอยต์ในโค้ด Python ตรงไปตรงมาและไม่สร้างความรำคาญเหมือนกับที่คุณเห็นใน IDE หรือไม่?


ใช้ PyCharm มันจะง่ายกว่าการป้อนบรรทัดเบรกพอยต์ได้อย่างไรยกเว้นการรันโดยใช้ Python IDE
Ciro Santilli 郝海东冠状病六四事件法轮功

เพียงใช้python -m pdb <your_script>.py แล้วb <line_number>ตั้งเบรกพอยต์ตามหมายเลขบรรทัดที่เลือก (ไม่มีวงเล็บฟังก์ชัน) กดcเพื่อไปยังจุดพักของคุณ คุณสามารถดูจุดพักทั้งหมดของคุณโดยใช้bคำสั่งด้วยตัวมันเอง พิมพ์helpเพื่อดูคำสั่ง pdb อื่น ๆ ที่พร้อมใช้งานขณะทำการดีบัก
arcseldon

1
ตั้งแต่ Python 3.7 ตอนนี้คุณสามารถใช้breakpoint()ฟังก์ชันbuiltin ได้แล้ว python.org/dev/peps/pep-0553
Daniel

คำตอบ:


119

คุณสามารถเรียกใช้โปรแกรมของคุณpdbจากบรรทัดคำสั่งโดยเรียกใช้

python -m pdb your_script.py

มันจะแตกในบรรทัดที่ 1 จากนั้นคุณจะสามารถเพิ่มเบรกพอยต์ได้ทุกที่ที่คุณต้องการในโค้ดของคุณโดยใช้breakคำสั่งไวยากรณ์ของมันคือ:

b (เกี่ยว) [[ชื่อไฟล์:] ผ้าลินิน | ฟังก์ชัน [, เงื่อนไข]]

มีความยืดหยุ่นเพียงพอที่จะให้คุณเพิ่มจุดพักได้ทุกที่


24
เพื่อชี้แจงประเด็นนี้ถ้าฉันpdb.set_trace()และเข้าไปในดีบักเกอร์ใช้lคำสั่ง (รายการ) และเห็นว่าฉันต้องการตั้งเบรกพอยต์ที่บรรทัด 27 จากนั้นฉันจะป้อน: b 27และดีบักเกอร์จะตั้งค่าเบรกพอยต์ที่บรรทัด 27 (ฉันพบ เอกสารประกอบเป็นเรื่องยากที่จะเข้าใจดังนั้นจึงต้องการเพิ่มจุดชี้แจงนั้น)
benjaminmgross

9
นอกจากนี้ถ้าคุณมีวัตถุxและคุณต้องการที่จะหยุดเมื่อวิธีการfที่เรียกว่าคุณสามารถพูดได้แล้วbreak x.f c(ontinue)สิ่งนี้ใช้ได้แม้ว่าออบเจ็กต์จะอยู่ในไฟล์ที่ไม่สามารถเข้าถึงได้หรือถูกสร้างขึ้นแบบไดนามิกเช่นโดยการไม่คลิก
Sergey Orshanskiy

2
เมื่อทำการดีบักหลังจาก stacktrace คุณสามารถคัดลอก fullpath ไปยังโมดูลและต่อท้ายหมายเลขบรรทัดเช่นb /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596
ถูกต้อง

59

คุณสามารถใช้ได้:

from pdb import set_trace as bp

code
code
bp()
code
code

ไม่แน่ใจว่าเหตุใดจึงใช้นามแฝงที่เหนือกว่า แต่ ;-) ด้วยเหตุผลบางอย่าง IDE / Editor (vscode) ของฉันเป็น mare AM นี้และคอยขีดเส้นใต้ การดูความคิดเห็นของคุณช่วยฉันได้จริงๆ มีวันที่ดี!
MrMesees

ขอบคุณมาก!
mooreds

ฉันจะบังคับให้นำเข้าset_traceเฉพาะเมื่อฉันใช้ bp () ได้อย่างไร
alper

39

ในกลุ่มฉันมีมาโครที่ตั้งค่าไว้สำหรับสิ่งนี้ (ในไฟล์. vimrc ของฉัน):

map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

ดังนั้นฉันจึงสามารถกด \ b (เมื่อไม่ได้อยู่ในโหมดแทรก) และมันจะเพิ่มเบรกพอยต์หลังบรรทัดปัจจุบันหรือ \ B (สังเกตตัวพิมพ์ใหญ่) และวางไว้ก่อนบรรทัดปัจจุบัน

ซึ่งดูเหมือนจะใช้งานได้ดี โปรแกรมแก้ไขโปรแกรมเมอร์ที่ 'ง่าย' อื่น ๆ ส่วนใหญ่ (emacs, sublimetext ฯลฯ ) ควรมีวิธีง่ายๆในการทำเช่นนี้

แก้ไข: จริงๆแล้วฉันมี:

au FileType python map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
au FileType python map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

ซึ่งจะเปิดใช้งานสำหรับไฟล์ซอร์ส python เท่านั้น คุณสามารถเพิ่มบรรทัดที่คล้ายกันสำหรับจาวาสคริปต์หรือภาษาอื่น ๆ ที่คุณใช้

อัปเดต 2019 (Python 3.7+)

Python 3.7+ มี builtin breakpoint()ซึ่งสามารถแทนที่ก่อนหน้านี้import pdb; pdb.set_trace()ใน vim มันยังใช้งานได้เหมือนเดิม


2
ทางออกที่ดีและบรรทัดที่เพิ่มจะมีการเยื้องที่ถูกต้องเช่นกันหากคุณมีset autoindentในไฟล์. vimrc
Jealie

ใช่ฉันไม่เข้าใจว่าทำไม Distros ส่วนใหญ่ไม่จัดส่งset autoindent(และตัวเลือกอื่น ๆ อีกมากมาย) เป็นมาตรฐาน สิ่งแรกที่ฉันทำกับระบบใหม่คือดึง vimrc ที่ดีขึ้น ...
Daniel

1
เพียงใช้ vim ชื่อ register! บันทึกบรรทัดที่คุณต้องการที่จะ buffer 'D' (ในขณะที่d ebug) โดยการกด"dyyและเมื่อใดก็ตามที่คุณต้องการเพียงแค่ทำหรือ"dp "dPเรียนรู้การลงทะเบียนเป็นกลุ่ม ! มีประโยชน์มากและได้รับการสนับสนุนเสมอ!
polvoazul

วิธีเพิ่ม: w หลังจากนั้น?
ji-ruh

เมื่อใช้แนวคิดการลงทะเบียนที่มีชื่อเพิ่มเติมอีกเล็กน้อยคุณสามารถบันทึกแมโครดำเนินการตามที่จำเป็นแล้วหยุดแมโคร จากนั้นวางเนื้อหามาโครลงในไฟล์ vimrc ของคุณ ตัวอย่างเช่นเริ่มต้นมาโครqdจากนั้นจึง"dpจะวางในภายหลัง สุดท้ายกำหนดคำแนะนำของคุณให้กับการลงทะเบียนเพื่อให้มีการเติมข้อมูลบน vim loadup เสมอ ตัวอย่าง: let @d = 'oimport pdb; pdb.set_trace()k0:w' ตอนนี้ใช้@dเมื่อใดก็ตามที่คุณต้องการวางบรรทัดลงในไฟล์ ข้างต้นยังบันทึกไฟล์ แต่คุณจะต้องบันทึกของคุณเอง (แทนที่จะคัดลอก / วางด้านบน) เนื่องจากมีอักขระพิเศษที่เกี่ยวข้อง (สำหรับการหลบหนี ฯลฯ )
arcseldon

27

หากคุณไม่ต้องการตั้งค่าเบรกพอยต์ด้วยตนเองทุกครั้งที่รันโปรแกรม (ใน Python 3.2+) เช่นบอกว่าคุณต้องการสร้างเบรกพอยต์โดยตรงที่บรรทัด 3 และหยุดการดำเนินการที่นั่น:

python -m pdb -c "b 3" -c c your_script.py

ข้อมูลต่อไปนี้อาจช่วยได้:

หากไฟล์. pdbrc มีอยู่ในโฮมไดเร็กทอรีของผู้ใช้หรือในไดเร็กทอรีปัจจุบันไฟล์จะถูกอ่านและดำเนินการราวกับว่ามีการพิมพ์ที่พร้อมต์ดีบักเกอร์ สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับนามแฝง หากมีไฟล์ทั้งสองไฟล์ในโฮมไดเร็กทอรีจะถูกอ่านก่อนและนามแฝงที่กำหนดไว้สามารถถูกแทนที่โดยไฟล์โลคัล

การเปลี่ยนแปลงในเวอร์ชัน 3.2: .pdbrc สามารถมีคำสั่งที่ดำเนินการดีบักต่อไปเช่นดำเนินการต่อหรือถัดไป ก่อนหน้านี้คำสั่งเหล่านี้ไม่มีผล

ใหม่ในเวอร์ชัน 3.2: ตอนนี้ pdb.py ยอมรับอ็อพชัน -c ที่รันคำสั่งเสมือนกำหนดในไฟล์. pdbrc โปรดดูที่คำสั่ง Debugger


23

ฉันยังไม่ได้ลองใช้ แต่พวกเขาเพิ่งติดตั้งในตัวใหม่ที่เรียกว่าเบรกพอยต์ ()ใน Python 3.7 ซึ่งหมายความว่าคุณสามารถแทรกเบรกพอยต์ด้วยคำสั่งเดียวได้ในตอนนี้:

breakpoint()

1
สำหรับ Python 3.7 นี่คือคำตอบ
eric

10

นี่คือวิธีที่คุณจะใช้ pdb ในบรรทัดคำสั่งโดยไม่ต้องใช้อะไรเลยในซอร์สโค้ดของคุณ (เอกสารและแหล่งข้อมูลออนไลน์อื่น ๆ ไม่ได้ผลดีที่จะอธิบายสิ่งนี้ให้กับโปรแกรมเมอร์ที่เคยใช้ตัวแก้ไขภาพเท่านั้นในอดีต):

เริ่ม pdb โดยพิมพ์คำสั่งต่อไปนี้ในเชลล์พร้อมต์:

python -m pdb 'python_script'

คำสั่งนี้เริ่มต้น pdb และดีบักเกอร์ pdb จะแตกที่บรรทัดแรกของ python_script ของคุณและรออินพุตจากคุณ:

(Pdb)

นี่คืออินเทอร์เฟซสำหรับการสื่อสารกับดีบักเกอร์ ตอนนี้คุณสามารถระบุคำสั่งของคุณได้ที่นี่ ตรงข้ามกับการใช้ปุ่มหรือแป้นพิมพ์ลัดในตัวแก้ไขภาพที่นี่คุณจะใช้คำสั่งเพื่อให้ได้ผลลัพธ์เดียวกัน

คุณสามารถไปที่บรรทัดถัดไปในโค้ดของคุณโดยใช้คำสั่ง "n" (ถัดไป):

(Pdb) n

การดำเนินการถัดไปจะแสดงหมายเลขบรรทัดและรหัสเฉพาะในแหล่งที่มา:

> python_script(line number)method name
-> current line in the source code

คุณสามารถตั้งค่าเบรกพอยต์ได้โดยระบุหมายเลขบรรทัดในซอร์สโค้ดของคุณ

(Pdb) b 50

ที่นี่ดีบักเกอร์ถูกตั้งค่าให้ทำลายที่บรรทัด 50 หากไม่มีเบรกพอยต์อื่นเบรกพอยต์ที่บรรทัด 50 จะเป็นเบรกพอยต์แรกและสามารถอ้างอิงได้โดยรหัสเบรกพอยต์ซึ่งเป็น 1 ในกรณีนี้ หากคุณเพิ่มจุดพักมากขึ้นพวกเขาจะได้รับตัวระบุตามลำดับ (เช่น 2, 3 เป็นต้น)

เมื่อตั้งเบรกพอยต์แล้วคุณจะดำเนินการโปรแกรมของคุณต่อไปจนกว่า pdb จะเข้าสู่เบรกพอยต์ดังนี้:

(Pdb) c

เมื่อคุณไปถึงจุดพักคุณสามารถไปที่บรรทัดถัดไปโดยใช้คำสั่ง n ตามที่อธิบายไว้ก่อนหน้านี้ หากคุณต้องการตรวจสอบค่าของตัวแปรคุณต้องดำเนินการคำสั่งพารามิเตอร์ดังนี้:

(Pdb) p variable_name

หากคุณไม่ต้องการเบรกพอยต์อีกต่อไปคุณสามารถล้างได้โดยส่งรหัสของเบรกพอยต์ด้วยคำสั่ง clear:

(Pdb) clear 1

ในที่สุดเมื่อคุณทำดีบักเกอร์เสร็จแล้วคุณสามารถออกจากการดำเนินการได้ตามที่คุณจะออกจากตัวแปลบรรทัดคำสั่ง python

(Pdb) exit()

ฉันหวังว่านี่จะช่วยให้ทุกคนเริ่มต้นกับ pdb นี่คือรายการคำสั่งที่คุณสามารถใช้กับดีบักเกอร์: pdb so question and answers



4

คุณสามารถใช้ IDE ที่รองรับการดีบัก python หรือคุณสามารถตรวจสอบเครื่องมือ Winpdb ที่ยอดเยี่ยม ซึ่งทำงานบนแพลตฟอร์มใดก็ได้และมีสิ่งอำนวยความสะดวกในการแก้ไขจุดบกพร่องแบบกราฟิกให้กับสคริปต์ Python ของคุณ

http://winpdb.org/


2

คุณสามารถใช้ได้:

  • ปีก ide
  • คราสด้วยปลั๊กอิน pydev
  • พีชาร์ม

ทั้งหมดข้างต้นสนับสนุนการดีบัก python จากภายใน IDE


0

ใน Atom หากติดตั้งปลั๊กอิน Python คุณสามารถพิมพ์ ' pdb' และกด Enter จากนั้นตัวอย่างข้อมูลจะพิมพ์นำเข้าและติดตามกลับให้คุณ

ฉันเคยชินกับสิ่งนี้แล้วบางครั้งฉันก็พิมพ์ลงไปแม้ว่าฉันจะแก้ไขเป็นกลุ่มและรอให้รายการแบบเลื่อนลงปรากฏขึ้น


0

วิธีการ underrated คือการตั้งค่าจุดพักใน pdb โดยตรง:

pdb> b torch/__init__:10

จะตั้งค่าเบรกพอยต์ site-packages\torch\__init__.py:10

จากนั้นpdb> cจะหยุดที่จุดพักนี้

ต่อไปนี้ใช้ได้เช่นกัน:

pdb> b d:\anaconda\lib\site-packages\torch\__init__.py:10
pdb> b torch\__init__.py:10
pdb> b d:\\anaconda\\lib\\site-packages\\torch\\__init__.py:10
pdb> b d:/anaconda/lib/site-packages/torch/__init__.py:10

ดูรายละเอียดในเอกสาร


0

คุณสามารถใช้ Vim กับปลั๊กอินPython-Modeหรือ Emacs กับปลั๊กอินElpy

ปลั๊กอินเหล่านี้ช่วยให้คุณมีเบรกพอยต์ด้วยการกดแป้นพิมพ์ที่ง่ายดาย ( \ bใน Vim และC-c C-u bใน Emacs) รวมทั้งคุณสมบัติอื่น ๆ อีกมากมายจาก IDE ที่มีน้ำหนักมาก (การพับโค้ดการปรับโครงสร้างใหม่การขุย ฯลฯ ) ทั้งหมดนี้อยู่ในโปรแกรมแก้ไขข้อความที่ใช้เทอร์มินัลน้ำหนักเบา


-1

วิธีที่ง่ายที่สุดในการเรียกใช้ดีบักเกอร์บนสคริปต์ของคุณคือ

pdb your_script.py

การรัน pdb บนบรรทัดคำสั่ง Linux ให้

usage: pdb.py scriptfile [arg] ...

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