วิธีใช้เบรกพอยต์สำหรับการดีบัก


9

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

คำตอบ:


9

ตามที่ระบุไว้ในคำตอบของ Majenko Arduino IDE ไม่ได้จัดเตรียมกลไกเบรกพอยต์ แต่Atmel Studio รองรับการเบรกพอยต์ [*]

อย่างไรก็ตามหากคุณมีสวิตช์และไฟ LED คุณสามารถติดตามความคืบหน้าของโปรแกรมของคุณในแบบที่ให้ประโยชน์บางอย่างของจุดพัก คุณจะเพิ่มรูทีนย่อยสมมติBPReport()ว่าผ่านเอาต์พุตอนุกรมหรือ LCD รายงานค่าของตัวแปรที่สำคัญจากนั้นติดไฟ LED และรอจนกว่าสวิตช์จะถูกกดและปล่อยพร้อมกับ debounce เรียกBPReport()รูทีนของคุณไม่ว่าคุณต้องการเบรกพอยต์แบบไม่มีเงื่อนไข สำหรับจุดพักที่มีเงื่อนไขคุณสามารถมีรูทีนBPReportIf(cond)ที่เรียกใช้ BPReport()ถ้าcondเป็นจริง หากคุณไม่ต้องการส่งสัญญาณออกทางอนุกรมคุณอาจใช้ LED หลายตัวหรือจอ LCD และคุณอาจใช้สวิตช์หลายตัวหากคุณต้องการการควบคุมการแบ่งสัญญาณภายนอก (ตัวอย่างเช่นcondอาจเป็นการทดสอบสวิตช์พิเศษตัวใดตัวหนึ่ง)

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


4

แม้ว่า Majenko คำตอบของเขาจะถูกต้องมีตัวเลือกอื่นอยู่บ้าง

ตามการดีบักฮาร์ดแวร์จริงตามที่ระบุไว้โดย majenko ฉันจะพูดว่า:

  1. ติดตั้งและใช้ IDE จริงเช่น Atmel Studio หรือปลั๊กอิน arduino eclipse ชื่อ sloeber (ฉันเป็นผู้เขียน) และ
  2. ใช้ตัวแก้จุดบกพร่องฮาร์ดแวร์เต็มรูปแบบหรือฮาร์ดแวร์ที่มีอยู่บนบอร์ดเช่น Arduio zero หรือฮาร์ดแวร์ที่ใช้เทคโนโลยีการดีบักอื่น ๆ เช่น ESP8266 ที่ช่วยให้การดีบัก USB

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

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

โปรดทราบว่าเครื่องในประเทศของคุณน่าจะเป็น 32 หรือ 64 บิตและ Arduino ส่วนใหญ่เป็น 8 bitters ซึ่งจะทำให้เกิดความแตกต่างของชนิดข้อมูลซึ่งเป็นจุดสนใจพิเศษเมื่อใช้วิธีนี้


4

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

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

ภาพหน้าจอด้านบนแสดงตัวอย่างภาพร่างที่เรียกใช้บน Arduino Mega พร้อมจอแสดงผลเอาต์พุตอนุกรมที่ใช้โดยแอปพลิเคชันและ Serial1 ที่ใช้สำหรับเชลล์ดีบักเกอร์

คำสั่งดีบัก Sketch

  • ASSERT (cond) ตรวจสอบเงื่อนไขการยืนยัน ถ้าเป็นเท็จเชลล์ดีบักจะถูกเรียกใช้ ร่างไม่สามารถดำเนินการต่อได้
  • BREAKPOINT () เชลล์ดีบั๊กถูกเรียก
  • BREAK_IF (cond) เชลล์ดีบักถูกเรียกใช้หากเงื่อนไขเป็นจริง
  • CHECK_STACK (ห้อง) ตรวจสอบว่ามีห้อง (ไบต์) บนสแต็ก ถ้าเป็นเท็จเชลล์ดีบักจะถูกเรียกใช้
  • DEBUG_STREAM (dev) ใช้อุปกรณ์สตรีมที่กำหนดสำหรับเซสชันดีบั๊ก อนุกรมโดยทั่วไป
  • OBSERVE (expr) พิมพ์นิพจน์ไปยังสตรีมการดีบัก
  • OBSERVE_IF (cond, expr) พิมพ์นิพจน์ไปยังสตรีมการดีบักหากเงื่อนไขเป็นจริง
  • ลงทะเบียน (var) ลงทะเบียนตัวแปรสำหรับการเข้าถึงจากเชลล์ดีบั๊ก แก้ไขคำสั่งเชลล์

แก้ไขคำสั่งเชลล์

  • ? VARIABLE อยู่ตัวแปรพิมพ์และความคุ้มค่า
  • @VARIABLE พิมพ์ที่อยู่ตัวแปรตัวชี้และค่าอ้างอิง
  • backtrace พิมพ์ call-stack แบบง่าย
  • คำสั่ง พิมพ์รายการคำสั่ง (ดูเพิ่มเติมที่วิธีใช้)
  • ข้อมูล พิมพ์เนื้อหาของ data area เช่นตัวแปรทั่วโลก
  • เดินทาง ออกจากเปลือกแก้ปัญหาและดำเนินการต่อการดำเนินการของร่าง
  • heap พิมพ์เนื้อหาของ heap เช่นข้อมูลที่จัดสรรแบบไดนามิก
  • ช่วย พิมพ์รายการคำสั่ง
  • หน่วยความจำพิมพ์สถานะหน่วยความจำ
  • ออกจาก Stop Sketch
  • สแต็ค พิมพ์เนื้อหาของสแต็กเช่นเฟรมการโทรอาร์กิวเมนต์ที่อยู่ส่งคืน
  • ตัวแปร พิมพ์รายการตัวแปรที่ลงทะเบียน
  • โดยที่ พิมพ์ไฟล์โค้ดและบรรทัดซอร์สที่เชลล์ดีบักถูกเรียกใช้

คำสั่งเชลล์ดีบักทั้งหมดสามารถย่อให้เป็นคำสั่งอักขระเดียว โปรดดู README สำหรับรายละเอียดเพิ่มเติม; รายละเอียดการติดตั้งเช่นร่างและการเปรียบเทียบ


1
ไลบรารีบริจาคของ Mikael ช่วยให้คุณกำหนดจุดพักแบบมีเงื่อนไข, ค่าตัวแปรการพิมพ์, สถานะหน่วยความจำ, ร่องรอยการโทร, และตัวแปรตรวจสอบและเปลี่ยนที่จุดพัก Pro: ไม่จำเป็นต้องใช้ฮาร์ดแวร์ ($$), ไม่ยากเกินความจำเป็นสำหรับ Flash (เป็นการตั้งค่าและการลบเบรกพอยต์ด้วยตัวดีบักเกอร์ฮาร์ดแวร์) ....
JRobert

1
Con: ผลกระทบที่สูงขึ้นต่อพื้นที่โค้ดของโปรแกรม, พื้นที่แรมบางส่วน, & อาจเรียกใช้เวลาถ้าตรวจสอบรหัสเวลาที่สำคัญ; เส้นโค้งการเรียนรู้บางส่วนที่จะรวบรวม (และเอาออกภายหลัง) การเรียกห้องสมุด ความจำเป็นในการคาดการณ์ตำแหน่งจุดพักหรือรวบรวมใหม่เมื่อคุณค้นหาตำแหน่งที่คุณต้องการ ข้อเสียไม่ใช่คำวิจารณ์ของงานของมิคาเอล พวกเขามาพร้อมกับเทคนิคนี้
JRobert

1
@JRobert Nice Pro-Con สรุป! ฉันได้พยายามจัดการกับข้อด้อยบางอย่างโดยอนุญาตให้ดีบักเกอร์ได้รับการปรับแต่ง มีชุดของคำจำกัดความที่จะอนุญาตให้แอปพลิเคชันที่มีความสำคัญต่อรอยเท้าเพื่อลดเชลล์ดีบักให้เหลือน้อยที่สุด ในฐานะที่เป็นดีบักเกอร์ใด ๆ สำหรับระบบฝังตัวมันเป็นเรื่องยากที่จะแก้ปัญหาเวลารหัสสำคัญ (ต่อเนื่อง) ที่มีจุดพัก ทางเลือกเดียวคือจุดสังเกต สิ่งเหล่านี้สามารถปรับให้เหมาะสมได้โดยใช้บัฟเฟอร์การติดตามและลบเอาต์พุตอนุกรมในรหัสเวลาที่สำคัญ
Mikael Patel

3

ไม่ได้อยู่ใน Arduino IDE

คุณต้อง:

  1. ติดตั้งและใช้ IDE จริงเช่น Atmel Studio และ
  2. ใช้ตัวแก้จุดบกพร่องฮาร์ดแวร์แบบเต็ม

ไม่มีข้อกำหนดสำหรับการดีบักผ่านอินเตอร์เฟส UART / USB โดยใช้ bootloader

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