วิธีแก้ปัญหาสคริปต์ Ruby [ปิด]


153

ฉันคัดลอกรหัส Ruby ต่อไปนี้จากอินเทอร์เน็ตและทำการเปลี่ยนแปลงเล็กน้อย แต่ไม่ได้ผล

ฉันจะทำอย่างไรเพื่อแก้ไขข้อบกพร่องของโปรแกรมด้วยตัวเอง


1
การลงคะแนนเพื่อเปิดใหม่ OP ต้องการการดีบักขั้นตอนที่เหมือน GDB อย่างชัดเจน
Ciro Santilli 法轮功冠状病六四事件法轮功

คำตอบ:


145

ใช้แงะ ( GitHub )

ติดตั้งผ่าน:

$ gem install pry
$ pry

จากนั้นเพิ่ม:

require 'pry'; binding.pry

เข้าสู่โปรแกรมของคุณ

ในฐานะของpry0.12.2 แต่มีคำสั่งนำทางไม่มีเช่นnext, breakฯลฯ บางอัญมณีอื่น ๆ pry-byedebugนอกจากนี้ยังให้บริการนี้ดูตัวอย่าง


10
ฉันยังแนะนำให้ใช้ Pry (แน่นอนเปลี่ยนชีวิต!) .. binding.pryเมื่อติดตั้งและจำเป็นต้องใช้ในโปรแกรมของคุณตั้งค่าเบรกพอยต์เป็นเรื่องง่ายเหมือนการเขียน นอกจากนี้ยังมาพร้อมกับการเติมสีการค้นหาเอกสารและความเป็นไปได้ในการแก้ไขและโหลดวิธีการใหม่ ..
Andrea Fiore

5
หน้าแรกแงะมีอยู่ที่นี่: pryrepl.org
shadowbq

4
Pry/ byebugดีมาก แต่ไม่เป็นขั้นตอนที่ 1 ของคุณเมื่อทำการดีบั๊ก ในกรณีส่วนใหญ่การเพิ่มข้อยกเว้นด้วยraise object.inspectจะช่วยแก้ปัญหาของคุณได้เร็วกว่าการเปิดเซสชัน irb ฉันแนะนำให้ใช้คอนโซลดีบั๊กเพียงครั้งเดียวโซลูชันที่ง่ายขึ้นเช่นการเพิ่มข้อยกเว้นไม่สามารถแก้ปัญหาของคุณได้
Kelsey Hannan

3
มีวิธีการรหัสขั้นตอนเดียวด้วยpryหรือไม่ ฉันหาวิธีทำไม่ได้ และนั่นคือสิ่งที่ฉันคาดหวังจากตัวดีบัก
jpetazzo

2
@jpetazzo ใช่โดยพิมพ์ 'next'
marcbest

114
  1. ในทับทิม:

    ruby -rdebug myscript.rb 

    แล้ว

    • b <line>: ใส่จุดพัก
    • และn(ext)หรือs(tep)และc(ontinue)
    • p(uts) สำหรับการแสดงผล

    (เช่น perl debug)

  2. ใน Rails: เรียกใช้เซิร์ฟเวอร์ด้วย

    script/server --debugger

    และเพิ่มdebuggerในรหัส


7
-rdebug เป็นขยะ และไร้สี ใช้แงะ (ดูคำตอบอื่น ๆ )
Snowcrash

3
@SnowCrash - ทำไมคุณพูดว่า-r debugขยะ
sid smith

8
ด้วย -rdebug: ไม่จำเป็นต้องเปลี่ยนไฟล์ต้นฉบับเพื่อที่จะแก้ปัญหา
germanlinux

2
สำหรับแอปพลิเคชั่น Ruby / Rails ใหม่ Pry เป็นคำตอบที่ถูกต้อง แต่ฉันใช้เวลากว่าหนึ่งชั่วโมงในการพยายามหา Pry เวอร์ชันโบราณเพื่อรันบนแอพ Rails 2.2 ที่มีข้อกำหนดเฉพาะfacetsในอัญมณีเฉพาะรุ่นและไม่ประสบความสำเร็จ สำหรับแอพ Rails โบราณruby-debugนั้นค่อนข้างน่ารังเกียจ แต่ก็ทำงานเสร็จแล้ว
Abe Voelker

56

ตามที่แนะนำ banister: ใช้แงะ! ฉันเห็นด้วยกับสิ่งนี้เท่านั้น

แงะเป็นแบบจำลองที่ดีกว่า IRB

คุณต้องเพิ่ม

require 'pry'

ไปยังไฟล์ต้นฉบับของคุณแล้วใส่เบรกพอยต์ในซอร์สโค้ดของคุณโดยการเพิ่ม

binding.pry

ในสถานที่ที่คุณต้องการดูสิ่งต่าง ๆ (นี่เป็นเหมือนจุดกระตุ้นจุดพักในสภาพแวดล้อม IDE ดั้งเดิม)

เมื่อโปรแกรมของคุณฮิต

binding.pry

บรรทัดคุณจะถูกโยนลงใน pry repl โดยที่บริบททั้งหมดของโปรแกรมของคุณอยู่ในมือเพื่อให้คุณสามารถสำรวจทุกสิ่งรอบ ๆ ตรวจสอบวัตถุทั้งหมดเปลี่ยนสถานะและแม้แต่เปลี่ยนรหัสได้ทันที

ฉันเชื่อว่าคุณไม่สามารถเปลี่ยนรหัสของวิธีการที่คุณอยู่ในขณะนี้ดังนั้นคุณจึงไม่สามารถเปลี่ยนบรรทัดถัดไปที่จะดำเนินการได้ แต่รหัสทับทิมที่ดีมักจะเป็นบรรทัดเดียวอย่างไรก็ตาม ;-)


30

แก้จุดบกพร่องโดยการเพิ่มข้อยกเว้นคือไกลได้ง่ายขึ้นกว่า squinting ผ่านprintงบบันทึกและข้อบกพร่องมากที่สุดโดยทั่วไปของมันได้เร็วขึ้นมากกว่าการเปิดขึ้นดีบัก IRB เหมือนหรือpry byebugเครื่องมือเหล่านั้นไม่ควรเป็นขั้นตอนแรกของคุณเสมอไป


การดีบัก Ruby / Rails อย่างรวดเร็ว:

1. ด่วนวิธีการ: ยกExceptionแล้วและ.inspectผลของมัน

เร็วที่สุดวิธีที่จะแก้ปัญหาทับทิม (โดยเฉพาะ Rails) รหัสคือการraiseมีข้อยกเว้นตามเส้นทางการดำเนินการของรหัสของคุณในขณะที่โทร.inspectกับวิธีการหรือวัตถุ (เช่นfoo):

raise foo.inspect

ในโค้ดด้านบนraiseทริกเกอร์สิ่งExceptionที่หยุดการทำงานของรหัสของคุณและส่งกลับข้อความแสดงข้อผิดพลาดที่มี.inspectข้อมูลเกี่ยวกับวัตถุ / วิธีการ (เช่นfoo) ในบรรทัดที่คุณพยายามตรวจแก้จุดบกพร่อง

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

2. ทางเลือก: ใช้debugger IRB ruby like byebugorpry

หลังจากที่คุณมีข้อมูลเกี่ยวกับสถานะของการประมวลผลโค้ดของคุณแล้วคุณควรพิจารณาย้ายไปที่ดีบั๊ก irb gem rubb เช่นpryหรือbyebugที่ที่คุณสามารถเจาะลึกเข้าไปในสถานะของวัตถุภายในเส้นทางการทำงานของคุณ


คำแนะนำสำหรับผู้เริ่มต้นทั่วไป

เมื่อคุณพยายามที่จะดีบักปัญหาคำแนะนำที่ดีคือให้ อ่านข้อความข้อผิดพลาด! @ # $ ing (RTFM)

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

  1. สิ่งที่ชั้นจะอ้างอิงข้อผิดพลาดหรือไม่ (เช่นฉันมีคลาสวัตถุที่ถูกต้องหรือเป็นวัตถุของฉันได้nilอย่างไร )
  2. อะไรวิธีการไม่อ้างอิงข้อผิดพลาดหรือไม่ (เช่นเป็นชนิดในวิธีการนั้นฉันจะเรียกวิธีนี้ในวัตถุประเภทนี้ / คลาสนี้ได้หรือไม่ )
  3. ในที่สุดเมื่อใช้สิ่งที่ฉันสามารถอนุมานจากคำถามสองข้อสุดท้ายของฉันฉันควรตรวจสอบบรรทัดของรหัสใด (จำไว้ว่า: บรรทัดสุดท้ายของรหัสในการติดตามสแต็กไม่จำเป็นว่าปัญหาอยู่ที่ใด)

ในการติดตามสแต็กให้ความสนใจเป็นพิเศษกับบรรทัดของรหัสที่มาจากโครงการของคุณ (เช่นบรรทัดที่ขึ้นต้นด้วยapp/...ถ้าคุณใช้ Rails) 99% ของปัญหาที่เกิดขึ้นกับรหัสของคุณเอง


เพื่อแสดงให้เห็นว่าทำไมการตีความตามลำดับนี้จึงมีความสำคัญ ...

เช่นข้อความแสดงข้อผิดพลาด Ruby ที่ทำให้ผู้เริ่มต้นสับสนหลายคน:

คุณรันโค้ดที่บางจุดดำเนินการเช่น:

@foo = Foo.new

...

@foo.bar

และคุณได้รับข้อผิดพลาดที่ระบุ:

undefined method "bar" for Nil:nilClass

เริ่มต้นเห็นข้อผิดพลาดนี้และคิดว่าปัญหาอยู่ว่าวิธีการที่barจะไม่ได้กำหนด มันไม่ใช่. ในข้อผิดพลาดนี้ส่วนที่แท้จริงที่สำคัญคือ:

for Nil:nilClass

for Nil:nilClassหมายความว่านั่น@fooคือไม่มี! @fooไม่ใช่Fooตัวแปรอินสแตนซ์! Nilคุณมีวัตถุที่เป็น เมื่อคุณเห็นข้อผิดพลาดนี้ก็เพียงแค่ทับทิมพยายามที่จะบอกคุณว่าวิธีการที่ไม่ได้อยู่สำหรับวัตถุของชั้นเรียนbar Nil(ดีนะ! เนื่องจากเราพยายามใช้วิธีการสำหรับวัตถุของคลาสFooไม่Nil)

น่าเสียดายเนื่องจากข้อผิดพลาดนี้เขียน ( undefined method "bar" for Nil:nilClass) มันง่ายที่จะถูกหลอกให้คิดว่าข้อผิดพลาดนี้เกี่ยวข้องกับbarการเป็นundefinedอยู่ เมื่อไม่ได้อ่านอย่างระมัดระวังข้อผิดพลาดนี้ทำให้ผู้เริ่มต้นเข้าใจผิดอย่างละเอียดในรายละเอียดของbarวิธีการFooนั้นหายไปอย่างสิ้นเชิงส่วนหนึ่งของข้อผิดพลาดที่บอกเป็นนัยว่าวัตถุนั้นเป็นคลาสที่ผิด (ในกรณีนี้: ไม่มี) เป็นความผิดพลาดที่หลีกเลี่ยงได้ง่ายโดยการอ่านข้อความผิดพลาดทั้งหมด

สรุป:

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

tl; dr:อย่าเหล่ที่บันทึกการพิมพ์: ยกข้อยกเว้นหรือใช้ตัวดีบัก irb แทน หลีกเลี่ยงหลุมกระต่ายโดยการอ่านข้อผิดพลาดอย่างรอบคอบก่อนทำการดีบั๊ก


3
ในขณะที่ฉันเห็นด้วยกับคุณว่าการอ่านบันทึกการพิมพ์นั้นน่าเบื่อฉันคิดว่าการแนะนำให้ไม่ใช้ตัวดีบั๊กในตอนแรกนั้นเป็นคำแนะนำที่แย่มาก การเพิ่มเบรกพอยต์และการทริกเกอร์มันเป็นความพยายามเช่นเดียวกับการเพิ่มข้อยกเว้น แต่ให้มุมมองแบบเต็มของสถานะปัจจุบันของแอปพลิเคชัน หากมีคำถามเพิ่มเติมใด ๆ เกิดขึ้นจากการตรวจสอบสถานะที่น่าสงสัยคุณสามารถเจาะลึกแบบโต้ตอบแทนการเพิ่มอีกหนึ่งข้อยกเว้นและรีสตาร์ทแอปพลิเคชัน
Patrick R.

2
@PatrickR จากประสบการณ์ของผมแก้จุดบกพร่องคณะกรรมการไม่ได้เป็นขั้นตอนแรกที่ดีเมื่อคุณยังคงพยายามที่จะเจาะลึกลงไปว่าที่เป็นปัญหาในรหัสของคุณคือ การเพิ่มและลบจุดพัก IRB จำนวนมากใช้เวลามากกว่าการเพิ่มข้อยกเว้นและไม่ได้ให้คำตอบที่ชัดเจนเกี่ยวกับโฟลว์การควบคุมของโค้ดของคุณในแบบที่ข้อยกเว้นสามารถทำได้สำหรับผู้เริ่มต้นในการกำจัดสมมติฐานที่ไม่ดี จุดพักของ IRB นั้นง่ายต่อการลืมทำให้เกิดความสับสนเมื่อมีการร้องขอ หากคุณทราบว่าปัญหาอยู่ที่ใดและจำเป็นต้องตรวจแก้จุดบกพร่องให้เริ่มต้นด้วย IRB ดีบัก แต่บ่อยครั้งที่ไม่เป็นความจริง
Kelsey Hannan

1
ฮะ! การอ่านข้อความแสดงข้อผิดพลาดมีประโยชน์สำหรับ Ruby แต่เป็นภาษาสคริปต์อื่น ๆ ฉันไม่สามารถตำหนิ OP เนื่องจากไม่ได้รบกวน
kayleeFrye_onDeck

1
ปฏิกิริยาเริ่มต้นของฉันคล้ายกับ @PatrickR. แต่ฉันก็ลองทำเช่นนี้ต่อไป ในท้ายที่สุดฉันคิดว่านี่เป็นคำแนะนำที่ไม่ดีหรืออาจเป็นคำแนะนำที่เหมาะกับกรณีการใช้งานที่แตกต่างจากที่ฉันมี โดยเฉพาะอย่างยิ่งกรณีที่ (a) ไม่ได้ใช้ Rails และ (b) มีผลลัพธ์ที่ผิด แต่ไม่มีข้อผิดพลาดหรือข้อยกเว้นเกิดขึ้นเช่นรหัสคำนวณตัวเลขมันเป็นจำนวนที่ไม่ถูกต้อง พยายามเดาซ้ำ ๆ ว่าจะสร้างโปรแกรมที่จะรันความผิดพลาดเป็นอย่างไร แต่มันก็ใช้ได้ดีกว่าเพราะฉันต้องรีสตาร์ทและเริ่มทำงานต่อไป แต่ละรอบมีเวลาเริ่มต้นของตนเองที่สูญเปล่า
อิฐ

20
  1. พิมพ์ตัวแปรทุกครั้งที่ทำได้ (ซึ่งเรียกว่าการดีบัก printf) คุณสามารถทำได้โดยการเรียกใช้

    STDERR.puts x.inspect

    หรือ

    STDERR.puts "Variable x is #{x.inspect}"

    หากคุณต้องการที่จะทำให้ง่ายต่อการพิมพ์แล้วคุณอาจต้องการที่จะใช้exemplorอัญมณี

  2. เปิดคำเตือน หากคุณใช้งานอยู่ให้rubyรันด้วย-wสวิตช์ (เช่นruby -w script.rb) หากคุณเรียกใช้จาก irb และคุณใช้ทับทิมรุ่นก่อนหน้า 1.9.2 ให้พิมพ์$VERBOSE = trueที่จุดเริ่มต้นเซสชันของคุณ หากคุณสะกดคำผิดตัวอย่างเช่นเมื่อคำเตือนอยู่ที่คุณจะได้รับ

    คำเตือน: ตัวแปรอินสแตนซ์@valeusไม่ได้เริ่มต้น

  3. ทำความเข้าใจกับแนวคิดของไบนารีสับ (คำพูดต่อไปนี้มาจากการปฏิบัติของผู้พัฒนาแบบ Agile )

    แบ่งพื้นที่ปัญหาออกเป็นสองส่วนและดูว่าครึ่งหนึ่งมีปัญหาใด จากนั้นแบ่งครึ่งครึ่งนั้นอีกครั้งแล้วทำซ้ำ

  4. หากคุณประสบความสำเร็จกับไบนารีสับคุณอาจพบว่ามีบรรทัดเดียวที่ไม่ได้ทำในสิ่งที่คุณคาดหวังว่าจะทำ ตัวอย่างเช่น

    [1, 2, 3].include?([1,2])

    ให้ค่าของแม้ว่าคุณจะคิดว่ามันจะกลับมาfalse trueในกรณีนั้นคุณอาจต้องการดูเอกสารประกอบ เว็บไซต์สำหรับเอกสาร ได้แก่ruby-doc.orgหรือAPIdock ในกรณีหลังคุณจะพิมพ์include?ถัดจากแว่นขยายใกล้มุมขวาบนเลือกสิ่งinclude?ที่Arrayอยู่ข้างใต้ (ถ้าคุณไม่รู้ว่าคลาส[1, 2, 3]คืออะไรพิมพ์[1, 2, 3].classirb) และคุณจะต้องรวมอะไรบ้าง (Array)ซึ่งอธิบายสิ่งที่มันทำ

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


7

ลบทุกสิ่ง

ยินดีต้อนรับสู่ 2017 ^ _ ^

เอาล่ะดังนั้นถ้าคุณไม่เห็นด้วยกับการพยายามออก IDE ที่ใหม่ที่คุณสามารถทำสิ่งต่อไปนี้สำหรับฟรี

คำแนะนำด่วน

  1. ติดตั้ง vscode
  2. ติดตั้ง Ruby Dev Kit หากคุณยังไม่ได้ติดตั้ง
  3. ติดตั้งส่วนขยาย Ruby, ruby-linter และ ruby-rubocop สำหรับ vscode
  4. ติดตั้งอัญมณีอะไรก็ได้rubyide / vscode-ruby ระบุด้วยตนเองหากจำเป็น
  5. กำหนดค่าของคุณที่launch.jsonจะใช้"cwd"และและ "program"เขตข้อมูลโดยใช้{workspaceRoot}แมโคร
  6. เพิ่มเขตข้อมูลที่เรียกว่า"showDebuggerOutput"และตั้งค่าเป็นtrue
  7. เปิดใช้งานจุดพักทุกที่ในการตั้งค่าการดีบักของคุณเป็น "debug.allowBreakpointsEverywhere": true

คำแนะนำโดยละเอียด

  1. ดาวน์โหลดVisual Studio Code aka vscode; นี้ไม่ได้เป็นเช่นเดียวกับVisual Studio ได้ฟรีน้ำหนักเบาและได้รับการยกย่องโดยทั่วไป
  2. ติดตั้ง Ruby Dev Kit คุณควรทำตามคำแนะนำที่ repo ของพวกเขาที่นี่: https://github.com/oneclick/rubyinstaller/wiki/Development-Kit
  3. ถัดไปคุณสามารถติดตั้งส่วนขยายผ่านทางเว็บเบราว์เซอร์หรือภายใน IDE สิ่งนี้มีไว้สำหรับภายใน IDE หากคุณเลือกอื่น ๆ ที่คุณสามารถไปที่นี่ นำทางไปยังส่วนขยายของ vscode คุณสามารถทำได้สองวิธี แต่วิธีการพิสูจน์อนาคตส่วนใหญ่อาจถูกกดปุ่มF1และพิมพ์ออกมาextจนกว่าจะมีตัวเลือกที่เรียกว่าExtensions: Install Extensionsพร้อมใช้งาน ทางเลือกคือCtrlShiftxและจากแถบเมนูด้านบนView->Extensions
  4. ถัดไปคุณจะต้องการส่วนขยายต่อไปนี้ สิ่งเหล่านี้ไม่จำเป็น 100% แต่ฉันจะให้คุณตัดสินใจว่าจะเก็บอะไรหลังจากที่คุณได้ทำการซ่อมแซม
    • ทับทิม; ผู้แต่งส่วนขยาย Peng Lv
    • ทับทิม rubocop; Misogi ผู้เขียนส่วนขยาย
    • ทับทิม linter; ผู้แต่งส่วนขยาย Cody Hoover
  5. ภายในไดเรกทอรีของสคริปต์ ruby ​​ของคุณเราจะสร้างไดเรกทอรีผ่าน command-line ที่เรียกว่า.vscodeและในนั้นเราจะมี แต่ไฟล์launch.jsonที่เราจะจัดเก็บตัวเลือกการกำหนดค่าบางอย่าง
    • launch.json เนื้อหา

{ "version": "0.2.0", "configurations": [ { "name": "Debug Local File", "type":"Ruby", "request": "launch", "cwd": "${workspaceRoot}", "program": "{workspaceRoot}/../script_name.rb", "args": [], "showDebuggerOutput": true } ] }

  1. ทำตามคำแนะนำจากผู้เขียนส่วนขยายสำหรับการติดตั้งอัญมณีด้วยตนเอง มันตั้งอยู่ที่นี่ตอนนี้: https://github.com/rubyide/vscode-ruby#install-ruby-dependencies
  2. คุณอาจต้องการความสามารถในการวางเบรกพอยต์ทุกที่ที่คุณต้องการ การไม่เปิดใช้งานตัวเลือกนี้อาจทำให้เกิดความสับสน ในการทำเช่นนี้เราจะไปที่แถบเมนูด้านบนแล้วเลือกFile->Preferences->Settings(หรือCtrl,) และเลื่อนจนกว่าจะถึงDebugส่วน ขยายและมองหาข้อมูลที่เรียกว่า"debug.allowBreakpointsEverywhere"- เลือกฟิลด์ที่และคลิกที่ไอคอนดินสอมองเล็ก ๆ น้อย ๆ trueและตั้งค่าให้

หลังจากทำทุกอย่างสนุกแล้วคุณควรจะสามารถตั้งค่าเบรกพอยต์และดีบักในเมนูที่คล้ายกับสิ่งนี้สำหรับกลางปี ​​2560 และชุดรูปแบบที่มืดกว่า: ป้อนคำอธิบายรูปภาพที่นี่ด้วยสิ่งที่สนุกสนานเช่นสแตกการโทรของคุณตัวแสดงตัวแปร ฯลฯ

PITA ที่ใหญ่ที่สุดคือ 1) การติดตั้ง pre-reqs และ 2) การจำเพื่อกำหนดค่า.vscode\launch.jsonไฟล์ มีเพียง # 2 เท่านั้นที่ควรเพิ่มสัมภาระใด ๆ ในโครงการในอนาคตและคุณสามารถคัดลอกการกำหนดค่าทั่วไปพอเช่นที่ระบุไว้ข้างต้น อาจมีตำแหน่งปรับตั้งทั่วไปมากกว่า แต่ฉันไม่รู้ด้านบนของหัว


ตอนนี้เป็นปี 2018 แต่น่าเสียดายที่คุณยังคงไม่สามารถดีบักการทดสอบหน่วยโดยใช้ปลั๊กอินที่คุณระบุไว้ที่นี่… sad ค่อนข้างเศร้า
MonsieurDart

1
@MonsieurDart เมื่อฉันเขียนสิ่งนี้มันมีความหมายสำหรับการดีบักพื้นฐานของสคริปต์ทับทิม ฉันไม่คุ้นเคยกับสิ่งใดโดยเฉพาะเกี่ยวกับการทดสอบหน่วย หากคำตอบนี้ไม่ถูกต้องหรือล้าสมัยโปรดแจ้งให้เราทราบสิ่งที่ต้องการความสนใจและข้อมูลใด ๆ ที่สามารถช่วยเร่งความเร็วในการประมวลผล
kayleeFrye_onDeck

เฮ้ @kayleeFrye_onDeck! คำตอบของคุณดีมากฉันให้คุณอย่างเต็มที่ แต่ครั้งล่าสุดที่ฉันตรวจสอบปลั๊กอิน Ruby ของ Peng Lv สำหรับ VSC มันไม่สามารถกำหนดจุดพักในการทดสอบหน่วย (หรือการทดสอบอื่น ๆ ) มันเป็นหนึ่งในข้อ จำกัด ที่รู้จักของปลั๊กอิน ฉันคิดว่าผู้คนจำเป็นต้องรู้สิ่งนี้ก่อนที่จะพยายามกำหนดค่าอินสแตนซ์ของ VSC: ต้องใช้เวลาและสำหรับหลาย ๆ คนการทดสอบเป็นวิธีที่หนึ่งในการเขียนและดีบักรหัส 😊
MonsieurDart

6

ฉันขอแนะนำวิดีโอนี้เพื่อเลือกเครื่องมือที่เหมาะสมในขณะนี้เพื่อแก้ปัญหารหัสของเรา

https://www.youtube.com/watch?v=GwgF8GcynV0

โดยส่วนตัวฉันจะเน้นสองหัวข้อใหญ่ในวิดีโอนี้

  • Pry นั้นยอดเยี่ยมสำหรับการดีบั๊กข้อมูล "pry คือ data explorer" (sic)
  • ดีบักเกอร์น่าจะดีกว่าในการดีบักทีละขั้นตอน

นั่นคือสองเซ็นต์ของฉัน!


6

คำตอบอื่น ๆ ทั้งหมดให้เกือบทุกอย่างแล้ว ... นอกจากนี้เล็กน้อย

หากคุณต้องการตัวดีบักคล้าย IDE (ไม่ใช่ CLI) และไม่กลัวการใช้ Vim เป็นตัวแก้ไขฉันขอแนะนำปลั๊กอินVim Ruby Debugger

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

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


6

ฉันเพิ่งค้นพบอัญมณีนี้ (เปลี่ยนแงะเป็นดีบักเกอร์สำหรับ MRI Ruby 2.0+)

https://github.com/deivid-rodriguez/pry-byebug

ติดตั้งด้วย:

gem install pry-byebug

จากนั้นใช้เหมือนpryทำเครื่องหมายบรรทัดที่คุณต้องการแบ่งที่:

require 'pry'; binding.pry

ซึ่งแตกต่างจากวานิลลาแงะ แต่อัญมณีนี้มีบางส่วน GDB-เช่นการนำคำสั่งที่สำคัญเช่นnext, stepและbreak:

break SomeClass#run            # Break at the start of `SomeClass#run`.
break Foo#bar if baz?          # Break at `Foo#bar` only if `baz?`.
break app/models/user.rb:15    # Break at line 15 in user.rb.
break 14                       # Break at line 14 in the current file.

5
  1. คุณสามารถพิมพ์ตัวแปรของคุณไปพร้อมกัน
  2. เปิดใช้งานการ-wตั้งค่าสถานะ (คำเตือน)
  3. ใช้เครื่องมือเช่นruby-debug

2
ฉันจะเพิ่มนั่นirbคือจุดเริ่มต้นที่ดี ลองใช้ irb กับชิ้นเล็ก ๆ ที่น่าสงสัย ฉันรัก ruby-debug (ruby-debug19 สำหรับ Ruby 1.9+) เพราะมันทำให้ง่ายต่อการหยุดโปรแกรมที่กำลังรันตรวจสอบตัวแปรวางลงใน irb จากนั้นทำงานต่อไป
ชายดีบุก

5

หากต้องการดีบักสคริปต์ Ruby shell ง่ายๆเพียงแค่เปลี่ยนบรรทัดแรกจาก:

#!/usr/bin/env ruby

ถึง:

#!/usr/bin/env ruby -rdebug

จากนั้นทุกครั้งที่แสดงคอนโซลดีบักเกอร์คุณสามารถเลือก:

  • cสำหรับการดำเนินการต่อไป (ไปข้อยกเว้นต่อไปเบรกพอยต์หรือสายด้วย: debugger)
  • n สำหรับบรรทัดถัดไป
  • w/ whereเพื่อแสดงเฟรม / call stack,
  • l เพื่อแสดงรหัสปัจจุบัน
  • cat เพื่อแสดง catchpoint
  • h สำหรับความช่วยเหลือเพิ่มเติม

ดูเพิ่มเติม: Debugging กับทับทิมแก้ปัญหา , ทางลัดที่สำคัญสำหรับการแก้ปัญหาทับทิมอัญมณี


ในกรณีที่สคริปต์หยุดทำงานและคุณต้องการ backtrace ลองใช้lldb/ gdblike:

echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby)

จากนั้นตรวจสอบกระบวนการทำงานเบื้องหน้าของคุณ

แทนที่lldbด้วยgdbหากทำงานได้ดีขึ้น คำนำหน้าด้วยsudoเพื่อดีบักกระบวนการที่ไม่ใช่เจ้าของ


1
ruby-debug ดูค่อนข้างล้าสมัย repo คอมไพล์สำหรับruby-debugมีเพียงหนึ่งคอมมิชชันสำหรับปีนี้ - มันยังคงรักษาไว้หรือไม่?
Andrew Grimm

นอกจากนี้ยังดูเหมือนว่าจะมาพร้อมกับทับทิมซึ่งเป็นสิ่งที่ยอดเยี่ยมเมื่อคุณอยู่ในอาการหยิก คำตอบที่ดี!
Breedly

5

ตั้งแต่ Ruby 2.4.0 การเริ่มเซสชัน IRB REPL ง่ายกว่าในช่วงกลางของโปรแกรม Ruby ใด ๆ วางบรรทัดเหล่านี้ไว้ตรงจุดในโปรแกรมที่คุณต้องการดีบัก:

require 'irb'
binding.irb

คุณสามารถเรียกใช้รหัส Ruby และพิมพ์ตัวแปรท้องถิ่น พิมพ์ Ctrl + D หรือquitเพื่อจบ REPL และปล่อยให้โปรแกรม Ruby ทำงานต่อไป

คุณยังสามารถใช้putsและpพิมพ์ค่าจากโปรแกรมของคุณในขณะที่กำลังทำงาน


4

หากคุณใช้RubyMine การดีบักสคริปต์ ruby ​​นั้นง่ายและตรงไปตรงมา

สมมติว่าคุณมีสคริปต์ Ruby hello_world.rb

1. ตั้งจุดพัก

ตั้งค่าเบรกพอยต์ที่บรรทัด 6 ดังนี้

ป้อนคำอธิบายรูปภาพที่นี่

2. เริ่มการดีบัก

ตอนนี้คุณสามารถเริ่มดีบักเกอร์เพื่อเรียกใช้สคริปต์:

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

3. ตรวจสอบตัวแปร ฯลฯ

จากนั้นเมื่อการดำเนินการถึงจุดหยุดคุณจะสามารถตรวจสอบตัวแปรและอื่น ๆ ได้

ป้อนคำอธิบายรูปภาพที่นี่

ข้อมูลเพิ่มเติมสำหรับการอ้างอิงของคุณ

  1. หากคุณต้องการใช้ RubyMine เพื่อทำการดีบักแบบรีโมทคุณสามารถทำได้
  2. หากคุณต้องการใช้ RubyMine กับรางดีบั๊กระยะไกลที่ทำงานภายในนักเทียบท่ามันก็ตรงไปตรงมาเช่นกัน

เรามีวิธีการดีบักไลบรารีภายนอกใน RubyMine หรือไม่?
Am33d

2

การดีบัก printf

มีการถกเถียงกันบ่อยครั้งเกี่ยวกับเทคนิคการดีบั๊กบางคนชอบที่จะดีบั๊กด้วยคำแถลงการพิมพ์บางคนชอบที่จะขุดลึกลงไปด้วยดีบั๊ก

ฉันขอแนะนำให้คุณลองทั้งสองวิธี

อันที่จริงคนหนึ่งใน Unix ที่มีอายุน้อยกล่าวว่าการดีบัก printf นั้นเป็นวิธีที่เร็วกว่าสำหรับเขาในบางจุด

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

มันควรจะให้คุณเข้าใจว่าโค้ดนั้นทอ

หากคุณยังใหม่กับซอฟต์แวร์ของคนอื่น ๆ มันอาจช่วยให้คุณก้าวผ่านไปได้

คุณจะรู้ได้อย่างรวดเร็วว่าพวกเขาจัดการมันด้วยวิธีที่ชาญฉลาดหรือไม่


ไม่ต้องสงสัยเลยว่าคำตอบที่ดีที่สุดนั้นขึ้นอยู่กับ
menriquez


1

แม่ของดีบักเกอร์ทั้งหมดเป็นหน้าจอพิมพ์เก่าแบบธรรมดา ส่วนใหญ่คุณอาจต้องการตรวจสอบวัตถุง่าย ๆ บางอย่างเท่านั้นวิธีที่รวดเร็วและง่ายดายเป็นดังนี้:

@result = fetch_result

p "--------------------------"
p @result

สิ่งนี้จะพิมพ์เนื้อหาของ @result ไปยัง STDOUT โดยมีบรรทัดด้านหน้าเพื่อระบุตัวตนได้ง่าย

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

ฉันคิดว่ามันใช้งานได้ 90% ของกรณีการใช้งานสำหรับฉัน คุณยังสามารถใช้ ruby-debug ได้ แต่ฉันพบว่ามันมากเกินไป


1

มี debuggers จำนวนมากที่มีคุณสมบัติแตกต่างกันตามที่คุณเลือก ลำดับความสำคัญของฉันพอใจกับการเคลื่อนไหวสอดรู้สอดเห็นซึ่ง:

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