سؤال

باعتباري شخصًا بدأ للتو في تعلم تعقيدات تصحيح أخطاء الكمبيوتر، طوال حياتي، لا أستطيع أن أفهم كيفية قراءة نص المكدس الخاص بتفريغ Windbg.ليس لدي أي فكرة من أين أبدأ بشأن كيفية تفسيرها أو كيفية القيام بذلك.هل يمكن لأي شخص أن يقدم التوجيه لهذه الروح المسكينة؟

على سبيل المثال (المكب الوحيد الموجود معي في الواقع)

>b69dd8f0 bfa1e255 016d2fc0 89efc000 00000040 nv4_disp+0x48b94

b69dd8f4 016d2fc0 89efc000 00000040 00000006 nv4_disp+0x49255

b69dd8f8 89efc000 00000040 00000006 bfa1dcc0 0x16d2fc0

b69dd8fc 00000000 00000006 bfa1dcc0 e1e71018 0x89efc000

أعلم أن المشكلة تتعلق ببرنامج تشغيل العرض Nvidia، لكن ما أريد معرفته هو كيفية قراءة المكدس فعليًا (على سبيل المثال، ما هو b69dd8f4؟) :-[

هل كانت مفيدة؟

المحلول

أولاً، تحتاج إلى تكوين الرموز المناسبة.ستسمح لك الرموز بمطابقة عناوين الذاكرة مع أسماء الوظائف.للقيام بذلك، يجب عليك إنشاء مجلد محلي في جهازك حيث ستقوم بتخزين ذاكرة تخزين مؤقت محلية للرموز (على سبيل المثال:ج:\الرموز).ثم تحتاج إلى تحديد مسار خادم الرموز.للقيام بذلك فقط اذهب إلى:ملف > مسار ملف الرمز واكتب:

SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

يمكنك العثور على مزيد من المعلومات حول كيفية تكوين الرموز بشكل صحيح هنا.

بمجرد قيامك بتكوين خادم الرموز بشكل صحيح، يمكنك فتح التفريغ المصغر من:ملف > فتح تفريغ الأعطال.

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

kpn 200

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

01 MODULE!CLASS.FUNCTIONNAME1(...)
02 MODULE!CLASS.FUNCTIONNAME2(...)
03 MODULE!CLASS.FUNCTIONNAME3(...)
04 MODULE!CLASS.FUNCTIONNAME4(...)

أين:

  • الرقم الأول:يشير إلى رقم الإطار
  • وحدة:ملف DLL الذي يحتوي على الكود
  • فصل:(فقط على كود C++) سيظهر لك الفصل الذي يحتوي على الكود
  • اسم الوظيفة:الطريقة التي تم استدعاؤها.إذا كان لديك الرموز الصحيحة سترى أيضًا المعلمات.

قد ترى أيضًا شيئًا مثل

01 MODULE!+989823

يشير هذا إلى أنه ليس لديك الرمز المناسب لمكتبة الارتباط الحيوي (DLL) هذه وبالتالي لا يمكنك سوى رؤية إزاحة الطريقة.

إذن، ما هو مكدس المكالمات؟

تخيل أن لديك هذا الكود:

void main()
{
  method1();
}

void method1()
{
  method2();
}

int method2()
{
  return 20/0;
}

في هذا الكود، ستطرح الطريقة 2 بشكل أساسي استثناءً لأننا نحاول القسمة على 0 وهذا سيؤدي إلى تعطل العملية.إذا حصلنا على تفريغ مصغر عند حدوث ذلك فسنرى مكدس الاستدعاءات التالي:

01 MYDLL!method2()
02 MYDLL!method1()
03 MYDLL!main()

يمكنك متابعة من مكدس الاستدعاءات هذا أن "الرئيسي" يسمى "الطريقة 1" والذي أطلق عليه بعد ذلك "الطريقة 2" وقد فشل.

في حالتك، لديك مكدس الاستدعاءات هذا (والذي أعتقد أنه نتيجة تشغيل الأمر "kb")

b69dd8f0 bfa1e255 016d2fc0 89efc000 00000040 nv4_disp+0x48b94
b69dd8f4 016d2fc0 89efc000 00000040 00000006 nv4_disp+0x49255
b69dd8f8 89efc000 00000040 00000006 bfa1dcc0 0x16d2fc0
b69dd8fc 00000000 00000006 bfa1dcc0 e1e71018 0x89efc000

يشير العمود الأول إلى مؤشر الإطار التابع، ويشير العمود الثاني إلى عنوان الإرجاع للطريقة التي يتم تنفيذها، وتعرض الأعمدة الثلاثة التالية المعلمات الثلاثة الأولى التي تم تمريرها إلى الطريقة، والجزء الأخير هو اسم DLL (nv4_disp) وإزاحة الطريقة التي يتم تنفيذها (+0x48b94).وبما أنه ليس لديك الرموز فلن تتمكن من رؤية اسم الطريقة.أشك في أن NVIDIA توفر وصولاً عامًا إلى رموزها، لذا أعتقد أنه لا يمكنك الحصول على الكثير من المعلومات من هنا.

أنصحك بتشغيل "kpn 200".سيُظهر لك هذا مجموعة الاستدعاءات الكاملة وقد تتمكن من رؤية أصل الطريقة التي تسببت في هذا العطل (إذا كانت مكتبة DLL لـ Microsoft، فيجب أن يكون لديك الرموز المناسبة في الخطوات التي قدمتها لك).

على الأقل تعلم أن الأمر مرتبط بخلل في NVIDIA؛-) حاول ترقية ملفات DLL الخاصة ببرنامج التشغيل هذا إلى الإصدار الأحدث.

في حال كنت تريد معرفة المزيد حول تصحيح أخطاء WinDBG، أوصي بالارتباطات التالية:

نصائح أخرى

يتوفر برنامج تعليمي جيد حقًا حول تفسير تتبع المكدس هنا:

http://www.codeproject.com/KB/debug/cdbntsd2.aspx

ومع ذلك، حتى مع وجود برنامج تعليمي كهذا، قد يكون من الصعب جدًا (أو شبه مستحيل) تفسير تفريغ المكدس دون توفر/تحميل الرموز المناسبة.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top