نگاهی به باگ بامزه امروز چس دات کام و گپی در مورد یک مهارت مهم: ترابل شوت سیستماتیک

من همه امروز رو مشغول ترابل شوتینگ مشکل ۴ تا سرور بودم و هنوزم حل نشده. برای حل مشکلات کامپیوتری استراتژی های مختلفی هست ولی در واقع خلاصه اشون اینه که کافیه منظم فکر کنین، شواهد رو کنار هم بچنین و اگر گزاره های کافی داشته باشین مشکل دیده می شه. اگر بتونین مشکل رو تکرار کنین احتمال پیدا کردنش بسیار بیشتره و اگر گزاره های بیشتر و بیشتری کنار هم بچینین احتمالا راه حل رو دارین.

به عبارت دیگه می گن «توضیح دقیق یک مشکل در دنیای کامپیوتر برابر است با حل اون مشکل». اما مشکل آماتورها موقع رفع خطا کجاست؟ هی حدس می زنن شاید مشکل فلان جا باشه و می رن سراغ حل اون مساله و بعد که مشکل حل نمی شه یه حدس دیگه می زنن و می رن اون رو حل کنن. شبیه تک تیراندازی که به جای هدفگیری دقیق و زدن یک تیر، دائما به اطراف شلیک می کنه به امید اینکه به هدف بزنه (: گاهی هم کار می کنه ولی روش صحیحی نیست.

حالا مشکل چی بوده؟

  • بعضی ها یکهو نتونستن از اپ مشهورترین سایت شطرنج یعنی چس دات کام بازی کنن

مشکل چی می تونه باشه؟ این سایت مشتری های پولی داره و باید سریع مشکل رو حل کنه. در چند قدم اول این گزاره ها اضافه شدن:

  • کسانی که مشکل دارن همه سعی میکنن بازی جدید شروع کنن
  • کسانی که مشکل دارن همه روی دیوایس های آی او اس هستن

بعد از چند قدم دیگه این گزاره اضافه می شه:

  • کسانی که مشکل دارن همه آیپدهای قدیمی دارن

هنوز حدس خیلی سخته. ولی دو گزاره مستقل از تحقیقات مستقیم که بدم احتمالا بعضی هاتون می تونین حدس بزنین مشکل چیه:

  • آیپدهای قدیمی ۳۲ بیتی بودن
  • برای شروع بازی، شماره سریال یونیک بازی به دستگاه ارسال می شه و توی هر حرکت استفاده می شه

بازم گزاره لازمه؟

  • تعداد بازی های سایت به ۲ میلیارد و ۱۴۷ میلیون و ۴۳۸ هزار و ۶۴۷ بازی رسیده، یعنی ۲ به توان ۳۱ منفی یک

امیدوارم تا الان حدس زده باشین، متغیری که کد بازی رو نگه می داره در آیپد ۳۲ بیتی است و حالا شماره بازی بزرگتر از ظرفیت حافظه شده و برنامه به هم می ریزه. یک کد که برنامه نویس سالها قبل پیش بینی نکرده بودش و الان باعث ۴۸ ساعت اختلال و کلی ترابل شوتینگ شده تا بشه این گزاره ها رو کنار هم گذاشت.

موقع برنامه نویسی به آینده فکر کنین و از اون مهمتر موقع ترابل شوتینگ، بیخودی به اطراف تیر نزنین. موقع عیب یابی باید مشکل رو تشخیص بدین و دقیق تعریف کنین. اینطوری مشکل خود به خود حل می شه. در واقع مشکل این بود که «حالا که بازی ها از ۲ به توان ۳۱ گذشته، روی آیپدهایی که ۳۲ بیت دارن دیگه نمی تونیم بازی جدید بسازیم». برم ببینم فردا با این ذهنیت می تونم مشکل امروز اون ۴ تا سرور رو حل کنم یا نه.

  • حمیدرضا

    فک می‌کنم جادی جان تو حساب کتاب اشتباه نوشتی. احتمالا تعداد بازی‌ها ها به (32^2) رسیده یعنی آخرین بازی عددش برابر بوده با 1-(32^2) که:
    (32^2) = 4294967296
    1-(32^2) = 4294967295

    • در ادامه‌ی حرفم: احتمالا جادی به این دلیل نوشته ۲ به توان ۳۱ که ظرفیت یه متغیر int رو (در یه سیستم ۳۲ بیتی) در نظر گرفته که البته منطقی تره که توسعه‌دهنده اپ از unsigned int استفاده کرده باشه چون تعداد بازی‌ها نمیتونه منفی باشه. ولی بازهم احتمال این که به اشتباه از int استفاده کرده باشه هست :)

  • بهروز

    لطفا کسره ی “چ” را قرار دهید.

    • eagle2

      البته نذاشتن کسره باعث شد چند ثانیه حسابی بخندم :)))

  • یک راه بهتر، error handling خوب هست. اگه کدی که مینویسیم بتونه error ها (یا حتا warning ها و notice ها) رو دقیق لاگ کنه چنین مشکلاتی پیش نمیاد. و با بررسی پریودیک لاگ‌ها میشه فهمید چه قسمتهایی درست کار نمیکنن یا مستعد خطا هستند. معمولاً در زبان‌های برنامه‌نویسی سمت سرور-سایدی که من تا اینجا میشناسم سرریز شدن متغییر حتماً باعث بروز خطا میشه.

    «پیشگیری بهتر از درمان :)»

  • محمد

    سلام
    این 32 بیتی و 64 بیتی بودن واسه آدرس دهی پردازنده هستش ، چرا ربطش دادند به ظرفیت متغییر ؟!

    • چرا نباید مربوط باشه؟ :)
      به احتمال زیاد برای نوشتن اپ آیپد از زبان objective-c استفاده میکنن و برای نشون دادن تعداد بازی‌ها از یه متغیر unsigned int استفاده شده (یا در حالت بددتر int) که این متغیر با توجه معماری سیستم ظرفیتش مشخص میشه

  • reza

    جالب بود. الان که دقت می کنم میبینم خدا رو شکر من ناخودآگاه تا الان روش درست رو انتخاب کردم و با ایجاد پیاپی اون مشکل سعی کردم بفهمم چجوری حلش کنم. جشن انتشار اوبونتو 17.04 نمیاین؟ توییتر هم ریپلای زدم ولی جواب ندادین.