Остановить выполнение моей программы и перейти в отладчик без установки точек останова (Visual Studio / GCC и C ++)

Некоторое время назад я нашел информацию об этой функции на SO, но тема была дубликатом Скрытые возможности 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);

Он должен вести себя как точка останова при ошибке. Это что-то вроде assertion, но без диалогов и более легкое.

Я не могу использовать здесь обычные точки останова, потому что мой модуль является частью нескольких проектов и его можно редактировать в нескольких решениях VS. Это приводит к тому, что точки останова, которые были установлены в одном решении, смещаются где-то в исходном коде, когда код редактируется в другом решении.


person zxcat    schedule 15.09.2009    source источник


Ответы (2)


Взгляните на DebugBreak

Вызывает исключение точки останова в текущем процессе. Это позволяет вызывающему потоку сигнализировать отладчику о необходимости обработки исключения.

пример:

 var = do_other_thing(...);
 if (var > MAX_VAR)
      DebugBreak();
person crashmstr    schedule 15.09.2009
comment
Спасибо! Несколько секунд назад нашла его :) Странно: поискал около часа - ничего не нашел. И после того, как вопрос был задан, правильный ответ был найден в документации за одну минуту :) - person zxcat; 15.09.2009

Забыл, мне тоже нужны сборки ARM, и одна из них скомпилирована не в MS Visual Studio :)

Более того, мне лучше не связывать дополнительный код в библиотечной версии моего модуля. Необходимость включать "winbase.h" для DebugBreak () была одной "плохой вещью", лучше иметь что-нибудь внутреннее. Но это маленькая "беда", потому что в финальной версии не будет точек останова :)

С помощью ответа crashmstr я нашел альтернативы 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; }
person zxcat    schedule 15.09.2009