ما هي أفضل طريقة إرفاق مصحح أخطاء إلى عملية في VC++ في النقطة الصحيحة في الوقت المناسب ؟

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

سؤال

عند التصحيح, في بعض الأحيان تحتاج إلى إرفاق بالفعل عملية تشغيل بدلا من بدء التطبيق في مصحح أخطاء.

من الشائع نفسي في وضع النوم() أو MessageBox الدعوة ، بحيث أنه من الأسهل إلى إرفاق مصحح أخطاء.أنا قلقة من أن بعض هؤلاء قد تكون ارتكبت في نهاية المطاف إلى "عنصر تحكم مصدر".

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

حراسة النوم أو مربع رسالة مع #ifdef _DEBUG هي طريقة واحدة ، ولكن أنا أتساءل عما إذا كان هناك طريقة أفضل.

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

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

نصائح أخرى

لإرفاق المصحح عند نقطة معينة، لديك عدة خيارات:

وأبسط هو فقط للاتصال DebugBreak، الذي هو الى حد كبير ما يعادل __asm int 3، ولكنه يعمل أيضا على أبنية أخرى (MSVC لإلى x64 لا يسمح تجميع مضمنة، إذا لم تخني). وهذا سوف إظهار إطار المصحح فقط في الوقت المناسب، وعليك أن تكون قادرا على تحديد من مصححات مسجل (أي البصرية ستوديو) لنعلق على هذه العملية.

وبدلا من ذلك، يمكنك إدخال الدعوة إلى Sleep، مما يتيح لك فرصة لإرفاق المصحح. يجب عليك استخدام #ifdef _DEBUG حول هذا، للتأكد من أنك لا السفينة فعلا مع هذا الرمز المدرجة.

وسؤال واحد: لماذا لا يمكنك تشغيل التعليمات البرمجية من IDE؟ هل من خدمة أو DLL محملة IIS أو ما شابه ذلك؟

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

إذا كنت تستخدم المصرف لهذا، يمكن تكوينه إما خادم أو عميل إلى مثيل WinDbg ثم التصحيح بهذه الطريقة. لقد فعلت ذلك في الماضي باستخدام WinDbg كما مصحح النواة، وباستخدام ImageFileExecutionOptions لبدء ntsd -d مع عملية الكشف عن اسمه. هذا يسبب WinDbg لاقتحام وضع المستخدم. هذا في بعض الأحيان تقنية مفيدة.

ومتغير آخر، وأنا في بعض الأحيان استخدام هو

while( !::IsDebuggerPresent() )
    ::Sleep( 100 ); // to avoid 100% CPU load

وكان ينبغي الانتظار فقط بصمت حتى إرفاق المصحح لهذه العملية.

فريدي و Reoa لها الحلول الصحيحة.ولكن أردت أن أضيف سبب عدم استخدام MessageBox.

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

  1. التواصل عبر رسائل Windows
  2. وقد غير تافهة واجهة المستخدم
  3. هو متعدد الخيوط

سوف تكون أساسا طلب المصحح في دولة واحدة ولكن ربط البرنامج الخاص بك في حالة مختلفة تماما.هذا يمكن أن يؤدي إلى حالات محيرة و الحشرات.

قمنا مؤخرا بإجراء تغيير في التعليمات البرمجية لدينا قاعدة أن لا تظهر MessageBox لتسهيل كسر لهذا السبب بالذات.وتنتج جدا سيئة السلوك غير تافهة التطبيق.

وبعد أن نعلق في 'مجرد نقطة الحق "هو الألم ... خيار واحد هو ولكن DebugBreak صريح () البيانات في التعليمات البرمجية لفرض هذه المسألة، وسوف تحرس لهم #ifdef _DEBUG يكون فكرة جيدة. نحن نستخدم ماكرو ASSERT يمكن أن نسميه DebugBreak ()، لذلك يمكنك فقط إرسال ASSERT (كاذبة)

وثمة خيار آخر للنظر هو استخدام "خيارات تنفيذ ملف الصورة" لإطلاق المصحح تلقائيا. انظر هذا بلوق و و ثائق MSDN .

ابحث عن:

DebugBreak , __debugbreak والأصدقاء

أو

ساكنة باطلة timeToChase() { __asm { int 3;};}

__asm int 3 

وهذه نقطة صعبة وإظهار الحوار التصحيح، والتي سوف تتيح لك إرفاق العملية. التفاف أنه في #IFDEF _DEBUG وسوف تصل إلا في يبني التصحيح.

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