🐞 دیباگ قدم‌به‌قدم کد آردوینو در شبیه‌ساز آنلاین: بریک‌پوینت و دیدن متغیرها

✍️ تیم ووکوی فارسی ·

برنامه‌ات کامپایل می‌شود، اجرا هم می‌شود، ولی جواب غلط می‌دهد. حالا چه کنی؟ بیشتر بچه‌ها ده‌ها خط Serial.println اضافه می‌کنند. راه بهتر دیباگر قدم‌به‌قدم است: برنامه را روی یک خط نگه می‌داری، مقدار همه‌ی متغیرها را می‌بینی و خط‌به‌خط جلو می‌روی. روی آردوینو Uno واقعی این کار به سخت‌افزار مخصوص نیاز دارد، ولی در یک شبیه ساز آردوینو آنلاین با یک کلیک انجام می‌شود. اگر از wokwi یا ووکوی آمده‌ای و دنبال دیباگر فارسی هستی، این آموزش برای توست.

چند کلمه‌ی کلیدی

یک برنامه‌ی باگ‌دار

این برنامه باید میانگین پنج عدد ۱۰، ۲۰، ۳۰، ۴۰ و ۵۰ را حساب کند؛ جواب درست ۳۰ است. ولی وقتی اجرایش کنی، عدد دیگری چاپ می‌شود. برای این برنامه هیچ قطعه‌ای لازم نیست؛ فقط یک آردوینو Uno.

int readings[5] = {10, 20, 30, 40, 50};

void setup() {
  Serial.begin(9600);
}

void loop() {
  int sum = 0;
  for (int i = 0; i <= 5; i++) {
    sum = sum + readings[i];
  }
  int average = sum / 5;

  Serial.print("average: ");
  Serial.println(average);
  delay(1000);
}

شکار باگ، قدم‌به‌قدم

  1. بریک‌پوینت بگذار. در ویرایشگر کد، روی حاشیه‌ی کنار شماره‌ی خط sum = sum + readings[i]; کلیک کن. یک نقطه‌ی قرمز ظاهر می‌شود. بریک‌پوینت را قبل از زدن دکمه‌ی اجرا بگذار.
  2. اجرا کن. برنامه تا این خط می‌رود و می‌ایستد. پنل «دیباگر» وضعیت «متوقف» را نشان می‌دهد و فهرست متغیرها را می‌بینی: sum برابر ۰ و i برابر ۰.
  3. ادامه بزن و هر بار متغیرها را نگاه کن. با i برابر ۱، ۲، ۳ و ۴، مقدار sum به ترتیب ۱۰، ۳۰، ۶۰ و ۱۰۰ است. تا این‌جا همه‌چیز درست است.
  4. لحظه‌ی کشف! یک بار دیگر ادامه بزن: sum حالا ۱۵۰ است، یعنی هر پنج عدد جمع شده‌اند، ولی برنامه باز هم روی همین خط می‌ایستد و این بار i برابر ۵ است. ولی آرایه‌ی ما فقط خانه‌های ۰ تا ۴ را دارد! خانه‌ی شماره‌ی ۵ بیرون از آرایه است و هر عددی که آن‌جای حافظه باشد، به sum اضافه می‌شود.
  5. درستش کن. شرط حلقه را از i <= 5 به i < 5 تغییر بده، بریک‌پوینت‌ها را با «پاک‌کردن نقطه‌ها» بردار و دوباره اجرا کن. حالا ۳۰ چاپ می‌شود.
به این باگ «یکی بیشتر» (Off-by-one) می‌گویند و بین برنامه‌نویس‌های حرفه‌ای هم یکی از رایج‌ترین باگ‌هاست. قاعده: آرایه‌ی n‌تایی از ۰ تا n منهای ۱ شماره دارد.

کی از دیباگر استفاده کنیم و کی از سریال؟

موقعیتابزار بهتر
می‌خواهی بدانی یک خط اصلاً اجرا می‌شود یا نهبریک‌پوینت
مقدار چند متغیر را در یک لحظه‌ی خاص می‌خواهیبریک‌پوینت و پنل متغیرها
عددی را در طول زمان دنبال می‌کنی (مثل سنسور)سریال مانیتور یا نمودار سریال
باگ فقط گاهی پیش می‌آیدسریال برای ثبت، بعد بریک‌پوینت روی همان شرط

در شبیه‌ساز تینکرکد فارسی

در تینکرکد فارسی دیباگر کنار ویرایشگر کد است: روی حاشیه‌ی خط‌ها بریک‌پوینت می‌گذاری، برنامه همان‌جا مکث می‌کند و دکمه‌های «ادامه»، «قدم بعد» و «توقف» را داری. بریک‌پوینت‌ها ذخیره می‌مانند، پس دفعه‌ی بعد هم سر جایشان هستند. پنل فقط متغیرهایی را نشان می‌دهد که تا آن خط ساخته شده‌اند. برای تمرین با یک برنامه‌ی واقعی، مثال میانگین متحرک را باز کن که دقیقاً با آرایه و حلقه کار می‌کند، و درس سنسور آرام: میانگین‌گیری را بخوان. فهرست خطاهای کامپایل هم در مقاله‌ی خطاهای رایج آردوینو آمده است.

اشکال‌های رایج

دیباگر و سریال با هم بهترین تیم‌اند؛ اگر سریال را هنوز خوب نمی‌شناسی، سریال مانیتور و نمودار سریال را بخوان. اگر شبیه‌ساز اصلاً کار نمی‌کند، صفحه‌ی شبیه‌ساز کار نمی‌کند؟ و برای همه‌ی پروژه‌ها صفحه‌ی شبیه‌ساز آردوینو را ببین.

دیباگر را در شبیه‌ساز امتحان کن 🐞

مقاله‌های مرتبط

🔧

کد آردوینو کار نمی‌کند؟ ۱۵ علت رایج، از سیم‌کشی تا تغذیه، با راه‌حل هر کدام

🐞

ارورهای رایج آردوینو و معنی‌شان: از was not declared in this scope تا avrdude

📈

سریال مانیتور و نمودار سریال آردوینو در شبیه‌ساز آنلاین

⚖️

رزبری پای پیکو، ESP32 یا آردوینو؟ کدام برد برای شروع بهتر است

همه‌ی آموزش‌های برنامه‌نویسی و عیب‌یابی آردوینو ← · همه‌ی مقاله‌ها