وقف تنفيذ البرنامج والذهاب إلى المصحح دون تحديد نقاط (Visual Studio/دول مجلس التعاون الخليجي و C++)
-
07-07-2019 - |
سؤال
لقد وجدت معلومات عن هذه الميزة على ذلك منذ بعض الوقت ، ولكن الموضوع مكرر من ملامح خفية من Visual Studio (2005-2008)? وأنا لا يمكن العثور عليه بعد الآن.
أريد أن استخدام شيء مثل هذا:
#ifdef DEBUG
#define break_here(condition) if (condition) ... // don't remember, what must be here
#else
#define break_here(condition) if (condition) return H_FAIL;
#endif
//...
hresult = do_something(...);
break_here(hresult != H_OK);
//...
var = do_other_thing(...);
break_here(var > MAX_VAR);
يجب أن تتصرف مثل توقف على خطأ.انها شيء مثل التأكيد, ولكن لا الحوارات و أكثر خفيفة الوزن.
لا أستطيع استخدام عادي نقاط التوقف هنا لأن الوحدة هي جزء من عدة مشاريع يمكن تحريرها في عدة VS الحلول.هذا يسبب نقاط ، التي أنشئت في حل واحد ، التحول في مكان ما في المصدر ، عندما رمز تحريرها في حل آخر.
المحلول
ونلقي نظرة على DebugBreak
<اقتباس فقرة>وأسباب استثناء نقطة توقف تحدث في العملية الحالية. وهذا يسمح للترابط استدعاء للإشارة إلى المصحح لمعالجة الاستثناء.
اقتباس فقرة>وعلى سبيل المثال:
var = do_other_thing(...);
if (var > MAX_VAR)
DebugBreak();
نصائح أخرى
وربما هذا من شأنه أن يساعد على: كيفية إضافة نقطة توقف الشرطي في Visual C ++
أنسى أحتاج الذراع يبني أيضا واحد منهم هو جمع لا في MS Visual Studio :)
وعلاوة على ذلك, إنه من الأفضل لي أن لا رابط تعليمات برمجية إضافية في المكتبة-نسخة من وحدة بلدي.الحاجة إلى إدراج "winbase.ح" من أجل DebugBreak() كان "سيئا" ، أفضل أن يكون بعض الجوهرية.ولكن هذا هو قليلا "سيئا", لأنه لن يكون هناك أي نقاط في الإصدار النهائي :)
مع مساعدة من crashmstr's الإجابة لقد وجدت بدائل DebugBreak().و الآن أنا باستخدام وبناء التالية:
#ifdef _DEBUG
#ifdef _MSC_VER
#ifdef _X86_
#define myDebugBreak { __asm { int 3 } }
#else
#define myDebugBreak { __debugbreak(); } // need <intrin.h>
#endif
#else
#define myDebugBreak { asm { trap } } // GCC/XCode ARM11 variant
#endif
#else
#define myDebugBreak
#endif
#define break_here(condition) if (condition) { myDebugBreak; return H_FAIL; }