سؤال

أستخدم pstack لتحليل ملفات التفريغ الأساسية في Solaris

وإلا كيف يمكنني تحليل التفريغ الأساسي من سولاريس؟

ما الأوامر التي يمكن استخدامها للقيام بذلك؟

ما هي المعلومات الأخرى التي ستكون متاحة من التفريغ؟

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

المحلول

يمكنك استخدام مصحح الأخطاء المعياري Solaris أو mdb أو dbx.يأتي mdb مزودًا بحزمة SUNWmdb (أو SUNWmdb x للإصدار 64 بت).

الملف الأساسي هو صورة العملية قيد التشغيل وقت تعطلها.

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

في إصدارات Solaris الحديثة، يمكنك تكوين ما سيحتوي عليه الملف الأساسي باستخدام الأمر coreadm ؛على سبيل المثال، يمكنك الحصول على أجزاء الذاكرة المعينة التي تم إرفاق العملية بها.

تشير إلى وثائق MDB و وثائق دي بي اكس.ال GDB مرجع سريع تعد البطاقة مفيدة أيضًا بمجرد معرفة أساسيات GDB.

نصائح أخرى

أعتقد أن أي إجابة لهذا السؤال يجب أن تبدأ بوصفة بسيطة:

بالنسبة لـ dbx، الوصفة هي:

% dbx a.out core
(dbx) where
(dbx) threads
(dbx) thread t@3
(dbx) where

إذا كان التفريغ الأساسي من برنامج قمت بكتابته أو إنشائه، فاستخدم أي مصحح أخطاء تستخدمه عادةً لتصحيح أخطاء التطبيق قيد التشغيل.يجب أن يكونوا جميعًا قادرين على تحميل الملفات الأساسية.إذا لم تكن دقيقًا بشأن مصححات الأخطاء، وكنت تستخدم Solaris، فإنني أوصي بـ dbx.سيساعدك الحصول على أحدث إصدار FCS من Sun Studio مع التصحيحات، أو الحصول على أحدث إصدار Express من Sun Studio.من المفيد أيضًا أن تتمكن من تحميل الملف الأساسي في مصحح الأخطاء على نفس النظام الذي تم إنشاء الملف الأساسي فيه.إذا كان الكود الموجود في المكتبات مختلفًا عما كان عليه عند إنشاء الملف الأساسي، فلن يكون تتبع المكدس مفيدًا عند المرور عبر المكتبات.يستخدم مصححو الأخطاء أيضًا المكتبات المساعدة لنظام التشغيل لفهم هياكل بيانات رابط libthread ووقت التشغيل، لذلك إذا كنت بحاجة إلى تحميل الملف الأساسي على جهاز مختلف، فستحتاج إلى التأكد من تطابق المكتبات المساعدة المثبتة على نظام التشغيل مع هياكل بيانات النظام في نظام التشغيل.يمكنك معرفة كل ما لم ترغب في معرفته أبدًا عن مكتبات النظام هذه في المستند التقني الذي تم كتابته قبل بضع سنوات.

http://developers.sun.com/solaris/articles/DebugLibraries/DebugLibraries_content.html

أود أن أقترح تجربة gdb أولاً لأنه من الأسهل تعلم المهام الأساسية مقارنة بمصححات أخطاء Solaris الأصلية في رأيي.

يمكن استخدام GDB.

يمكنه إجراء المكالمة التي تمت محاولتها قبل التفريغ.

http://sourceware.org/gdb/

http://en.wikipedia.org/wiki/GDB

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

لقد عملت بشكل رائع بالنسبة لي في الماضي.

ال com.pflags يعد الأمر مفيدًا أيضًا في تحديد الحالة التي كان عليها كل مؤشر ترابط عند تفريغه الأساسي.بهذه الطريقة يمكنك في كثير من الأحيان تحديد المشكلة.

قم بإرفاق صورة العملية باستخدام مصحح أخطاء dbx:

dbx [اسم_الملف_التنفيذي] [اسم_ملف_الملف_التنفيذي]

من المهم أنه لم تكن هناك تغييرات على الملف القابل للتنفيذ منذ أن تم تفريغ النواة (أي.ولم يتم إعادة بنائه).

يمكنك رؤية تتبع المكدس لمعرفة مكان تعطل البرنامج باستخدام أمر dbx "أين".

يمكنك التحرك لأعلى ولأسفل المكدس باستخدام الأمر "لأعلى" و"لأسفل"، أو الانتقال إلى إطار المكدس المحدد باستخدام "الإطار [الرقم]"، مع ظهور الأرقام في إخراج "أين".

يمكنك طباعة قيمة المتغيرات أو التعبيرات باستخدام الأمر "print [expr]".

استمتع.

لقد وجدت dbx على صندوق Solaris x86 الخاص بي في

/opt/SUNWspro/bin/dbx

هتافات!

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