أهلا ومرحبا.
في هذه المحاضرة ، أريد أن أتحدث قليلاً عن مكدس المكالمات ، وما هو بالضبط وكيف يمكنك قراءته
للمساعدة في تصحيح أخطاء برنامجك بشكل أكبر.
يتم إنشاء تتبع المكدس ، وهو أساسًا ما هو مكدس الاستدعاءات ، كلما تعطل تطبيقك
بسبب خطأ فادح.
السبب في استخدام مصطلح المكدس هو أنه يشير إلى بنية بيانات شائعة في البرمجة.
المكدس عبارة عن هيكل بيانات يُعرف باسم LIFO ، يدخل أخيرًا ويخرج أولاً ، وهذه هي الطريقة التي يتم بها تخزين
البيانات.
آخر عنصر بيانات تمت إضافته هو العنصر الأول الذي تسترده مرة أخرى.
يمكنك التفكير في الأمر نوعًا ما إذا كنت تأكل كومة من الفطائر ، فإن أول فطيرة تكون في الجزء السفلي
الذي تضيفه.
آخر فطيرة في القمة.
عندما تذهب لتناولها ، فإنك تأكل آخر ما تمت إضافته.
وبالتالي ، يكون تتبع المكدس مفيدًا جدًا عند تعطل برنامجك لأنه يحتوي على معلومات تساعدك
في تصحيحه.
لذا فإن تتبع المكدس يُظهر قائمة باستدعاءات الوظائف التي تؤدي إلى الخطأ.
وما سيحدث في البرنامج عندما تستدعي وظيفتك الرئيسية ، هذه هي نقطة الدخول.
الوظيفة الرئيسية هي استدعاء وظائف أخرى.
ستستدعي هذه الوظائف وظائف أخرى وسيتم وضع جميع الوظائف التي يتم تنفيذها أو
استدعاؤها على المكدس.
وهكذا يمكنك القيام بذلك عند تعطل أحد البرامج ، سيخبرك مكدس الاستدعاءات أن الوظيفة الأخيرة التي
تم استدعاؤها والسطر المحدد من الكود الذي تسبب في حدوث الخطأ.
لذلك يحتوي Callstack على الكثير من المعلومات الجيدة.
سيتضمن اسم الملف وأرقام أسطر الكود الذي يتسبب في حدوث الاستثناء أو الخطأ
الفادح.
يحتوي الجزء العلوي من المكدس على آخر مكالمة تسببت في الخطأ وقد تكون هناك مكالمات متداخلة.
يحتوي الجزء السفلي من المكدس على المكالمة الأولى التي بدأت سلسلة الاستدعاءات لاستدعاء الخطأ.
لذا ، إذا كنت تستخدم لغة C عادةً في الروتين الرئيسي ، فإنك تستدعي main ، وتستدعي main دالة أخرى ، والتي تستدعي
وظيفة أخرى وما إلى ذلك وهكذا دواليك.
وبعد ذلك تم تفصيل السطر الأخير.
إنه مفيد جدًا جدًا عند تعطل التطبيق.
وبالتالي عندما يتعطل برنامج سي ، فقد يؤدي إلى حدوث خطأ في التجزئة وهذا لا يخبرك بالكثير من المعلومات.
هذا يعني فقط أن شيئًا سيئًا حدث.
سيؤدي ذلك أيضًا إلى إنشاء ملف أساسي.
يمكنك تحليل الملف الأساسي الذي يحتوي على مكدس الاستدعاءات ، والذي سيخبرك بالضبط عن
سطر الكود الذي تسبب في حدوث مشكلة تعطلك.
لذلك تحتاج إلى العثور على المكالمة في التطبيق الخاص بك والتي تسبب التعطل.
وربما يكون مكدس المكالمات هو أفضل طريقة للقيام بذلك.
ولا تحتاج دائمًا إلى إلقاء نظرة على هذا الملف الأساسي.
يمكنك أيضًا تحليل مكدس الاستدعاءات باستخدام GDB مع مصحح أخطاء.
وأريد أن أريكم كيف يبدو هذا.
يستطيع المبرمج أيضًا تفريغ تتبع المكدس في أي وقت.
لذلك إذا اكتشفت خطأً أو أدركت أنه قد يحدث خطأ فادح ، فيمكنك تفريغ مكدس الاستدعاءات
لمعرفة ما يحدث.
إذا كنت لا تعرف بالفعل متى سيحدث الخطأ ، فلا يزال بإمكانك تفريغ مكدس
الاستدعاءات لمعرفة الآثار الحالية التي أدت إلى مكالمة معينة.
عند استخدام GDB ، سيبدو مكدس الاستدعاءات على هذا النحو.
يمكنك الوصول إلى مكدس المكالمات عبر القائمة عندما تقوم بتشغيل مصحح الأخطاء
في GDB وسأوضح لك كيفية القيام بذلك ، ولكن هذا ما يبدو عليه وما ستراه هنا هو أنه يحتوي
على رقم وعنوان ثم الوظيفة.
يحتوي مكدس الاستدعاءات المحدد هنا على الكثير من الاستدعاءات المختلفة ، لذلك لا بد أنه كان يقوم بالعديد من عمليات التداخل المختلفة
والكثير من استدعاءات الوظائف المختلفة.
ولكن في أسفل المكدس في السطر 22 ، تقول GTK main.
هذا يعني أن.
هذا يعني أنه ربما نفذ الوظيفة الرئيسية.
ثم في السطر 21 ، يبدو أنه تم تنفيذه.
ربما يقول بيان يقول تشغيل الحلقة الرئيسية.
ومن ثم يبدو أنها تسمى دالة تسمى G main Context iterate.
وداخل هذه الوظيفة ، كان هناك البعض كلما كان هناك استدعاء آخر لوظيفة إرسال السياق
الرئيسي لـ IAG.
إذن كانت هناك وظيفة مكررة ، ثم دالة إرسال ، ثم علامات الاستفهام في السطر 18
تعني أنه لا توجد معلومات تصحيح.
لا يعرف ما حدث هناك.
ولهذا السبب عند إنشاء برنامجك ، يمكنك إما إنشائه للإصدار أو إنشائه بمعلومات
تصحيح الأخطاء.
عندما تقوم بإنشائه بمعلومات تصحيح الأخطاء ، فإنه يحتوي على معلومات إضافية عندما تقوم بالتجميع بحيث يمكنك
عند التشغيل إلقاء نظرة على مكدسات المكالمات.
عندما تطلقه ، ابني شيئًا للإفراج عنه.
الملف القابل للتنفيذ أصغر كثيرًا وقد لا يحتوي على هذه المعلومات.
قد تحتوي على المزيد من علامات الاستفهام.
ولكن هذا سيخبرك أيضًا إذا قمت باستدعاء أي مكتبات ، أو أي برامج إضافية ، فسوف يستدعيها ويخبرك
بمكدس الاستدعاءات من هناك.
ولكن ما يظهره هذا ، مرة أخرى ، هو الأحداث المتداخلة المختلفة للمكالمة في الجزء العلوي
هو ما هو مهم ، لأن ذلك سيشير إلى سبب الانهيار.
لذلك يبدو أنه في مكدس الاستدعاء هذا ، كان التحديث الداخلي يسبب مشكلة.
ويمكنك أن ترى أنه من السطر 22 إلى السطر صفر ، هناك العديد من الاستدعاءات المختلفة لرموز مختلفة.
لكن البرنامج في نهاية المطاف يتعطل في الخط صفر مداخن المكالمات.
يمكنك أيضًا إلقاء نظرة على مكدسات المكالمات أثناء تشغيل البرنامج لرؤية المعلومات فقط حتى تتمكن من تتبعها
مرة أخرى.
لذلك إذا وضعت نقطة توقف داخل دالة ، فإنك تصحح الأخطاء ، وتقوم بتشغيل مصحح الأخطاء على ذلك.
سيتوقف مصحح الأخطاء عند نقطة الإيقاف تلك.
يمكنك بعد ذلك إظهار مكدس المكالمات وسيخبرك بكيفية وصولك إلى هذا السطر من التعليمات البرمجية.
تم استدعاء هذه الوظيفة قبل هذه الوظيفة.
ومرة أخرى ، ستبدأ عادةً بالوظيفة الرئيسية.
يمكنك أيضًا التبديل إلى إطارات مختلفة إذا كنت معتادًا على المكدس والمفهوم وكيف
يكون في الذاكرة ، يمكنك إلقاء نظرة على إطارات مختلفة ، ولكن هذه أداة مفيدة جدًا للعثور على الأعطال
بشكل أساسي في C ، ومن السهل جدًا يقرأ.
إذا نظرت إلى الجزء العلوي فقط ولم تفهم الكثير عن مكدس المكالمات ، فيمكنك إلقاء
نظرة على الجزء العلوي والقول ، أوه ، هذا مصدر ، هذا سطر من التعليمات البرمجية الذي تسبب في الانهيار.
هذا مثال جميل وجدته على الويب.
إكسما.
ايدو.
يوضح ذلك أمثلة مكدس استدعاء الوظيفة.
لذلك إذا نظرنا إلى مثال في الكود كما سنرى ، فلدينا فقط بعض الكود البسيط.
الحسابات لا تهم حقًا.
نحن في الأساس نستدعي بعض الوظائف.
إذن لدينا وظيفة mogrify وهذه الدالة النصفية حقًا والقيمة الرئيسية ستستدعي دالة mogrify
ومن ثم ستطلق عليها اسم half حقًا ثم ستعمل على mogrify حتى نتمكن من توضيح
مكدس الاستدعاءات وكيف تبدو في هذه الاستدعاءات من خلال تعيين نقطة توقف بسيطة في الأساس
ثم النظر إلى مكدس المكالمات أثناء تقدمنا وإجراء المكالمات.
لذا مرة أخرى ، سوف نتعرف أكثر على نقاط التوقف والمعلومات من هذا القبيل.
لكني أريد فقط أن أوضح مكدس الاستدعاءات بسرعة حقيقية وسنقدم في الواقع مثالاً أكثر تفصيلاً عن مكدس
الاستدعاءات لاحقًا.
لذا هنا أضع نقطة توقف.
يمكنني المضي قدمًا وبناء وتجميع هذا ويمكنني بدء مصحح الأخطاء وسنصل إلى نقطة التوقف هذه.
وما ستلاحظه الآن يمكنك رؤية كل قائمة مصحح الأخطاء هنا على الجانب الأيمن في الأسفل ،
وسترى مكدس الاستدعاءات.
لنجعل هذا أكبر قليلاً.
ولكن عندما يتوقف عند السطر 14 ، يوجد هنا بعض عبارات التخصيص وسترى أن مكدس الاستدعاءات
يظهر بشكل رئيسي.
إذا تخطينا ذلك وانتقلنا إلى السطر التالي ، يمكننا في الواقع أن نرى أنه ينتقل فقط إلى السطر 15 قبل
أن يستدعي Mogrify ، أليس كذلك؟
وهكذا ترى مكدس المكالمات يبقى مع Main.
إذا دخلنا ، فسترى الآن أن مكدس المكالمات يظهر Mogrify.
إذن نحن في الواقع داخل هذه الدالة.
يمكننا تخطي ذلك.
لذلك ينفذ السطر الأول ثم يعود درجة الحرارة.
لا يزال يظل في هذه الوظيفة ثم يعود حيث يقوم بالطباعة F على السطر 16 ، ترى كيف يتغير مكدس
الاستدعاءات.
ننتقل بعد ذلك إلى السطر 18 ، استدعاءات مكدس الاستدعاء الرئيسي ونخطو إلى دالة النصف الحقيقية.
والآن ترى أن مكدس الاستدعاءات يتغير حيث يظهر حقًا أن نصف الوظيفة في الجزء العلوي هي دائمًا
الوظيفة التي تم استدعاؤها آخر مرة.
مرة أخرى ، نتخطى الأمر وترى أننا ما زلنا في النصف حقًا.
نعود إلى Main ، نطبع شيئًا ما في السطر 19 ، نذهب إلى السطر 21.
ننتقل مرة أخرى إلى وظيفة التعديل ، والتي تراها مرة أخرى على مكدس الاستدعاءات ، نقفز من فوق ، ونقفز مرة أخرى
، وفي النهاية نطبع النتيجة النهائية في السطر 23 ونرجع من البرنامج.
لكن مكدس الاستدعاءات يوضح لنا مرة أخرى ترتيب الوظائف التي يتم استدعاؤها من وظيفة إلى
أخرى.
لذلك إذا كان لديك وظائف متداخلة ، فقد يكون الأمر أكثر تعقيدًا.
تتمثل ميزة مكدس المكالمات في أنه إذا كان لديك سطر من التعليمات البرمجية يتعطل ، على سبيل المثال في السطر الرابع
، فسيكون لديك مكدس مكالمات يحتوي في الجزء العلوي على مكان تعطل الخط.
وهكذا يمكنك في الواقع أن ترى من خلال تصفح مكدس الاستدعاءات ، ما هو سطر الكود الذي كان
آخر سطر تم استدعاؤه ، والذي سيخبرك بأي سطر من الكود تم تعطله.
لكنك سترغب في استخدام هذه الأداة عندما يتعطل برنامجك.
شكرًا لك.