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

Я нашел информацию об этой функции в 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);

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

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

Ответы [ 3 ]

9 голосов
/ 15 сентября 2009

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

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

пример:

 var = do_other_thing(...);
 if (var > MAX_VAR)
      DebugBreak();
2 голосов
/ 15 сентября 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; }
2 голосов
/ 15 сентября 2009
...