وسائل/أدوات حل لغزا Segfault في حين تعمل على كوندور

StackOverflow https://stackoverflow.com/questions/3681755

  •  02-10-2019
  •  | 
  •  

سؤال

أنا أكتب C التطبيق الذي يتم تشغيله عبر حساب الكتلة (باستخدام كوندور).لقد حاولت العديد من الطرق للكشف عن الإساءة إلى رمز ولكن دون جدوى.

القرائن:

  • في المتوسط عند تشغيل التعليمات البرمجية في 15 آلات لمدة 2 أيام, أحصل على اثنين أو ثلاثة segfaults (إشارة 11).
  • عند تشغيل التعليمات البرمجية محليا أنا لا تحصل على segfault.أجريت على ما يقرب من 3 أسابيع على آلة المنزل.

المحاولات:

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

للأسف الخط رقم أنتج هو عشوائي إلى حد ما.أنا لست متأكدا تماما ما يمكنني القيام به مع stacktrace.أليس أنه يسجل سوى عنوان الوظيفة التي segfault يحدث?

الشبهات:

  • وأظن أن تحقق لافتا نظام كوندور يستخدم لنقل الوظائف عبر الآلات هي أكثر حساسية الذاكرة الفساد و هذا هو السبب في أنني لا أرى ذلك محليا.
  • أن المؤشرات ويجري تلف من الشوائب ، و أن هذه المؤشرات هي التي تسبب segfault.وهذا يفسر حقيقة أن segfaults تحدث عشوائي إلى حد ما على خط الأعداد.

التحديث

البحث في هذا بعض أكثر لقد وجدت الروابط التالية:

تحديث 2

جريج اقترح النظر في كوندور الدخول إلى ربط segfaults عند كوندور تشغيل الملف القابل للتنفيذ من حاجز'.تبحث في سجلات segfaults كل ما يحدث فورا بعد إعادة تشغيل.كل من الإخفاقات تظهر أن تحدث عند عمل مفاتيح من نوع واحد من آلة إلى نوع آخر.

تحديث 3

على segfault كان بسبب الخلافات بين المضيفين ، من خلال وضع 'requiremets الميدانية في كوندور تقديم الملف إلى المشكلة اختفت تماما.

يمكن للمرء أن مجموعة الآلات الفردية:

requirements = machine == "hostname1" || machine == "hostname2"

أو فئة كاملة من الآلات:

requirements = classOfMachinesName

انظر متطلبات سبيل المثال هنا

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

المحلول

إذا كنت تستطيع ، ترجمة مع التصحيح و تعمل تحت gdb.بدلا من ذلك تحصل الأساسية ملقاة و تحميل ذلك في المصحح.

mpich وقد بنيت في المصحح ، أو يمكنك شراء التجارية الموازية المصحح.

ثم يمكنك التنقل خلال التعليمات البرمجية لمعرفة ما يحدث في المصحح

http://nmi.cs.wisc.edu/node/1610

http://nmi.cs.wisc.edu/node/1611

نصائح أخرى

يمكنك إنشاء تفريغ الأساسية عندما segfault يحدث ؟ ثم يمكنك تصحيح هذا تفريغ لمحاولة معرفة دولة القانون عندما تحطمت.

أنظر ماذا تعليمات تسبب في الخطأ.كان حتى صالح تعليمات أو تحاول تنفيذ البيانات ؟ إذا كان صحيحا ، ما هي الذاكرة فإنه يحاول الوصول ؟ أين هذا المؤشر تأتي من.تحتاج إلى تضييق موقع خطأك (كومة الفساد كومة الفساد ، غير مهيأ مؤشر الوصول إلى ذاكرة غير صالحة).إذا كان الفساد ، انظر إذا كان هناك أي المنذرة البيانات في تلف منطقة (مؤشرات إلى رموز البيانات التي تبدو وكأنها شيء في الهياكل،...).الذاكرة الخاصة بك مخصص قد بنيت في الميزات لتصحيح بعض الفساد (انظر MALLOC_CHECK_ على لينكس أو MallocGuardEdges على نظام التشغيل Mac OS).حالة شائعة لهذه يستخدم الذاكرة التي تم الحرة()'d, حتى تسجيل malloc() / مجانا() أزواج قد تساعد.

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

القابلة للتنفيذ التي تم إنشاؤها بواسطة condor_compile runnable بذاتها الثنائية خارج كوندور النظام.إذا قمت بتشغيل الثنائية المنبعثة من condor_compile محليا خارج كوندور, هل ما زلت ترى segfaults?

إذا كان لا يمكنك ربط segfaults عند كوندور تشغيل الملف القابل للتنفيذ من نقطة تفتيش (المستخدم تسجيل الدخول سوف اقول لكم عندما يحدث هذا).

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

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

أنا على افتراض أن معظم تفعله.وهذا قد يتطلب الكثير من الموارد.

على المدى القصير الخطوة هو وضع طن من "يؤكد" ( شبه بخط اليد ) من كل متغير للتأكد من أنه لم يتغير عندما كنت لا ترغب في ذلك.هذا يمكن أن مواصلة العمل كما تذهب من خلال عملية طويلة الأمد.

على المدى الطويل-محاولة تشغيله على مجموعة من اثنين ( ربما منزلك الكمبيوتر VM ).هل ما زلت ترى segfaults.إن لم يكن زيادة حجم الكتلة حتى يمكنك البدء في رؤية segfaults.

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

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

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