Xcode والتصحيح المتقدم في LLDB: الجزء 2

مساء الخير ، اليوم أوجه انتباهكم إلى الجزء الثاني من المقالة حول تطبيقات تصحيح الأخطاء في LLDB.

في الجزء الأول ، اكتشفنا كيفية استخدام نقاط التوقف في Xcode لتعديل الخصائص الحالية للمتغيرات وإضافة سطر من التعليمات البرمجية من خلال أوامر التعليمات.

لقد أنشأت مشروعًا تجريبيًا عن عمد مع وجود بعض الأخطاء من أجل معرفة كيفية استخدام أنواع مختلفة من نقاط التوقف في LLDB لتصحيح التطبيق.

إذا لم تكن قد درست الجزء الأول من المقال ، فمن الأفضل أن تبدأ به. دعني أذكرك بقاعدة مهمة في هذا البرنامج التعليمي: حتى نهاية هذه المقالة ، لا توقف المترجم ولا تقوم بإعادة تشغيل التطبيق بعد الإطلاق الأول. قمت بتصحيح الأخطاء أثناء تنفيذ البرنامج.

نقاط المراقبة

لذلك ، الخطأ التالي في التطبيق:

3. يمكنك تحميل المشاركات أكثر من 7 مرات.

كيفية إعادة إنتاج الخطأ:

  • قم بتشغيل الإنترنت على جهاز iPhone / جهاز محاكاة
  • انتقل لأسفل إلى نهاية الجدول لتحميل المزيد من الوظائف.
  • يمكنك تحميل منشورات أكثر من 7 مرات (على الرغم من أنه في هذا التطبيق لا ينبغي أن يكون لدى المستخدم مثل هذه الفرصة).

كواحد من الخيارات للكشف عن الأخطاء ، تحتاج إلى معرفة كيفية تحديث عدد صحيح عدد الصفحات بعد تحميل منشورات جديدة على الصفحة. نظرًا لأنك ما زلت غير معتاد على الكود ، فأنت بحاجة إلى قضاء بعض الوقت لفهم ما يحدث فيه.

لا تقلق تطبيق بعض السحر.

من الجزء الأول من المقالة ، علمنا أن طلب GET HTTP يتم تنفيذه في قسم الشبكات براغما . أنه يحتوي على وظيفة واحدة فقط loadPosts . ضع نقطة توقف على السطر الأول من هذه الوظيفة واسحب الجدول لأسفل للتحديث. سيتوقف المحول البرمجي عند نقطة الإيقاف هذه.

الصورة
الهدف ج

الصورة
سويفت

في النافذة السفلية من مصحح الأخطاء ، انقر فوق الزر "إظهار المتغيرات". ستظهر نافذة جديدة على اليسار ، والتي سترى فيها جميع المتغيرات PostsTableViewController.

الصورة

قم بتوجيه المؤشر إلى pageNumber ، وانقر بزر الماوس الأيمن وحدد "Watch _pageNumber" / "Watch pageNumber" لـ Objective-C و Swift ، على التوالي.

الصورة
الهدف ج

الصورة
سويفت

وبالتالي ، قمت بإنشاء نقطة مراقبة ما يسمى للمتغير pageNumber. Watchpoint هو نوع من نقاط التوقف التي توقف المصحح في كل مرة يتم فيها تغيير قيمة المتغير إلى التغييرات.

الصورة
الهدف ج

الصورة
سويفت

مواصلة البرنامج. توقف مصحح الأخطاء وترى شيئًا مما يلي:

الهدف ج

الصورة

  1. يسجل القيم القديمة والجديدة لمتغير pageNumber .
  2. تتبع مكدس من التعليمات البرمجية التي تغير قيمة متغير pageNumber .
  3. النقطة الحالية التي تسببت في تغيير متغير pageNumber هي طريقة setter لهذا المتغير.

إذا أشرت إلى الخطوة 1 في تتبع المكدس ، فسوف يقودك ذلك إلى مقتطف الشفرة التالي:

الصورة

سويفت

الصورة

  1. يعلمك مصحح الأخطاء أن نقطة الملاحظة التي قمت بتعيينها كشفت شيئا.
  2. تتبع مكدس من التعليمات البرمجية التي تغير قيمة متغير pageNumber .
  3. النقطة الحالية التي تسببت في تغيير متغير pageNumber هي وظيفة updateForNetworkCallEnd .

من المنطقي أن نستنتج أنه في كل مرة بعد طلب HTTP GET ناجح ، يتم زيادة متغير pageNumber بمقدار 1 حتى يصبح متغير الحالة (من نوع التعداد) في الحالة "النشطة". يمكن أن يكون لهذا المتغير حالتان: إما نشط ("نشط") أو غير نشط ("غير نشط"). تعني الحالة "النشطة" أنه يمكن للمستخدم تحميل المنشورات (أي أنه لم يتم الوصول إلى حد 7 التنزيلات). على العكس من ذلك ، تفترض الحالة "غير النشطة" أن المستخدم لن يكون قادرًا على تحميل المنشورات. نتيجةً لذلك ، نحتاج إلى إضافة منطق إلى وظيفة updateForNetworkCallEnd ، والتي ستقوم بفحص المتغير pageNumber وتعيين متغير الحالة إلى الحالة المناسبة.

كما قد تكون خمنت ، فمن الأسهل بكثير اختبار الفرضية أولاً دون إيقاف المترجم قبل إجراء تغييرات على الكود.

لاحظت أنه في قسم الدعم العملي ، لدينا بالفعل الوظيفة التي نحتاجها ( setToInactiveState ) ، والتي تحدد متغير الحالة إلى "غير نشط".
أضف نقطة توقف سطر واحد فوق حالة الشرط. أضف أيضًا الأمر التالي إلى المصحح.

الهدف ج

expression if (self.pageNumber >= 7) {[self setToInactiveState]} 

الصورة

سويفت

 expression if (self.pageNumber >= 7) {setToInactiveState()} 


الصورة

بعد ذلك ، احذف نقطة الإيقاف الأولى التي استخدمتها لتعيين نقطة المراقبة. أيضا إلغاء تنشيط watchpoint نفسها.

الصورة
الهدف ج

الصورة
الهدف ج

الصورة
سويفت

الصورة
سويفت

انتقل الآن إلى أعلى الجداول ، واسحب لأسفل للتحديث وابدأ التقليب.
كل شيء يعمل بها! لكن من المبكر للغاية الاحتفال ، لا يزال لدينا خطأ واحد يجب إصلاحه!

ما التالي؟

الجزء الأخير ، الجزء الثالث من المقال ، الذي نتعرف فيه على نوع آخر من نقاط التوقف - الرموز الرمزية (نقاط التوقف الرمزية).

Source: https://habr.com/ru/post/ar432122/


All Articles