Cara menggunakan breakpoint untuk debugging

9

Breakpoint adalah cara yang bagus untuk melihat bagaimana kompiler berjalan ke kode Anda. Sekarang pertanyaan saya adalah, apakah ada kemungkinan untuk menggunakan breakpoint ketika Anda men-debug kode Anda?

H. Pauwelyn
sumber

Jawaban:

9

Seperti disebutkan dalam jawaban Majenko, Arduino IDE tidak menyediakan mekanisme breakpoint tetapi Atmel Studio mendukung breakpoint . [*]

Namun, jika Anda memiliki sakelar dan LED, Anda dapat melacak kemajuan program Anda dengan cara yang memberikan beberapa manfaat breakpoints. Anda akan menambahkan subrutin, katakanlah BPReport(), bahwa melalui keluaran serial atau LCD melaporkan nilai variabel kritis, kemudian menyalakan LED dan menunggu sampai sakelar ditekan dan dilepaskan, dengan debounce. Panggil BPReport()rutin Anda di mana pun Anda ingin breakpoint tanpa syarat. Untuk breakpoint bersyarat, Anda dapat memiliki rutinitas BPReportIf(cond)yang memanggil BPReport()jika condbenar. Jika Anda tidak ingin membuat output melalui serial, Anda mungkin menggunakan beberapa LED atau LCD, dan Anda mungkin menggunakan beberapa sakelar jika Anda ingin kontrol pemutusan eksternal (misalnya, condbisa menjadi tes dari salah satu sakelar tambahan).

[*] Beberapa pelanggar perangkat keras memodifikasi kode yang diunduh setiap kali breakpoint ditambahkan, diubah, atau dihapus. Penggunaan itu akan menghabiskan memori flash lebih cepat daripada hanya sesekali mengunduh saja. Jika sebuah chip telah banyak digunakan untuk debugging seperti itu, jangan gunakan chip itu dalam sistem produksi.

James Waldby - jwpat7
sumber
4

Meskipun Majenko jawabannya benar ada beberapa opsi lain.

Adapun debugging hardware nyata seperti yang dinyatakan oleh majenko saya akan mengatakan:

  1. Instal dan gunakan IDE nyata, seperti Atmel Studio atau plugin arduino eclipse yang disebut sloeber (saya penulis), dan
  2. Gunakan debugger perangkat keras lengkap atau perangkat keras yang memilikinya di papan seperti nol Arduio atau perangkat keras menggunakan teknologi debugging lainnya seperti ESP8266 yang memungkinkan USB debugging

Opsi debug lain dari kategori yang sama sekali berbeda adalah mengatur kode Anda sehingga logika keputusan (bebas perangkat keras) dan tindakan (bergantung pada perangkat keras) benar-benar terpisah.

Kemudian kompilasi sketsa Anda sebagai program lokal dan debug "logika keputusan" pada mesin lokal Anda. Metode ini tidak memungkinkan untuk "debugging perangkat keras". Metode ini juga memungkinkan pengujian unit.

Perhatikan bahwa mesin lokal Anda mungkin 32 atau 64 pahit dan kebanyakan Arduino adalah 8 pahit yang akan menghasilkan perbedaan dalam tipe data yang merupakan titik perhatian ekstra saat menggunakan metode ini.

jantje
sumber
4

The Arduino-Debug perpustakaan menyediakan sederhana pada target debugger untuk sketsa Arduino. Perintah debug ditambahkan langsung ke sketsa. Shell perintah debugger dimulai pada break-point dan pernyataan.

masukkan deskripsi gambar di sini

Tangkapan layar di atas menunjukkan contoh sketsa yang dijalankan pada Arduino Mega dengan monitor keluaran Serial yang digunakan oleh aplikasi dan Serial1 digunakan untuk shell debugger.

Sketsa Perintah Debug

  • ASSERT (cond) Periksa kondisi tegas. Jika false shell debug dipanggil. Sketsa tidak dapat dilanjutkan.
  • BREAKPOINT () Shell debug disebut.
  • BREAK_IF (cond) Shell debug dipanggil jika kondisinya benar.
  • CHECK_STACK (kamar) Periksa apakah ada ruang (byte) di stack. Jika false shell debug dipanggil.
  • DEBUG_STREAM (dev) Gunakan perangkat aliran yang diberikan untuk sesi debug. Biasanya Serial.
  • OBSERVE (expr) Cetak ekspresi ke aliran debug.
  • OBSERVE_IF (cond, expr) Cetak ekspresi ke aliran debug jika kondisinya benar.
  • REGISTER (var) Daftarkan variabel untuk akses dari shell debug. Perintah Shell Debug

Perintah Shell Debug

  • ? VARIABEL Cetak alamat dan nilai variabel.
  • @VARIABEL Cetak alamat variabel penunjuk dan nilai referensi.
  • backtrace Mencetak tumpukan panggilan sederhana.
  • perintah Cetak daftar perintah (lihat juga bantuan).
  • data Mencetak isi area data, yaitu variabel global.
  • pergi Tinggalkan shell debug dan lanjutkan pelaksanaan sketsa.
  • heap Cetak konten heap, yaitu data yang dialokasikan dinamis.
  • bantuan Cetak daftar perintah.
  • memori Cetak status memori.
  • berhenti Berhenti sketsa.
  • stack Mencetak isi stack, yaitu bingkai panggilan, argumen, alamat pengirim.
  • variabel Cetak daftar variabel terdaftar.
  • di mana file kode sumber Cetak dan baris di mana shell debug dipanggil.

Semua perintah shell debug dapat disingkat menjadi perintah karakter tunggal. Silakan lihat README untuk perincian lebih lanjut; detail instalasi, contohnya sketsa dan benchmarking.

Mikael Patel
sumber
1
Pustaka donasi Mikael memungkinkan Anda mengatur breakpoint bersyarat, mencetak nilai variabel, status memori, jejak panggilan, & memeriksa-dan-mengubah variabel pada breakpoint. Pro: Tidak memerlukan perangkat keras ($$), tidak terlalu keras pada Flash (seperti pengaturan dan menghapus breakpoints dengan debugger perangkat keras akan). ....
JRobert
1
.... Con: Dampak yang lebih tinggi pada ruang kode program, beberapa ruang RAM, & kemungkinan waktu berjalan, jika memeriksa kode kritis waktu; beberapa kurva belajar untuk dikompilasi dalam (dan kemudian, hapus) panggilan perpustakaan; kebutuhan untuk mengantisipasi lokasi break-point atau kompilasi ulang ketika Anda menemukan di mana Anda membutuhkannya. The Cons bukanlah kritik terhadap karya Mikael; mereka datang dengan teknik ini.
JRobert
1
@JRobert Ringkasan Pro-Con yang Bagus! Saya telah mencoba untuk mengatasi beberapa Kontra dengan memungkinkan debugger disesuaikan. Ada satu set definisi yang akan memungkinkan aplikasi sensitif jejak untuk mengurangi shell debug ke minimum. Seperti halnya debugger untuk sistem tertanam, sulit untuk men-debug kode kritis waktu (kontinu) dengan break-point. Satu-satunya alternatif adalah titik pengamatan. Ini dapat dioptimalkan dengan menggunakan jejak buffer dan menghapus output serial dalam kode kritis waktu.
Mikael Patel
3

Tidak di Arduino IDE.

Kamu butuh:

  1. Instal dan gunakan IDE nyata, seperti Atmel Studio, dan
  2. Gunakan debugger perangkat keras lengkap

Tidak ada ketentuan untuk debugging melalui antarmuka UART / USB menggunakan bootloader.

Majenko
sumber