Visual Studio - может ли точка останова вызываться из кода? - PullRequest
31 голосов
/ 05 марта 2010

У меня есть проект модульного теста, основанный на UnitTest ++. Обычно я ставлю точку останова на последнюю строку кода, чтобы можно было проверить консоль в случае сбоя одного из тестов:

  n = UnitTest::RunAllTests();
  if ( n != 0 )
  {
  // place breakpoint here    
    return n;
  }
  return n;

Но я должен вставлять его каждый раз, когда я заново проверяю код из SVN. Это возможно каким-то образом установить точку останова компилятором?:

      n = UnitTest::RunAllTests();
      if ( n != 0 )
      {
      // place breakpoint here    
#ifdef __MSVC__
        @!!!$$$??___BREAKPOINT;
#endif
        return n;
      }
      return n;

Ответы [ 6 ]

60 голосов
/ 05 марта 2010

Используйте __debugbreak() встроенную (требуется включение <intrin.h>).

Использование __debugbreak() предпочтительнее прямой записи __asm { int 3 }, так как встроенная сборка не разрешена при компиляции кода для архитектуры x64.

И для записи, на Linux и Mac, с GCC, я использую __builtin_trap().

18 голосов
/ 05 марта 2010
DebugBreak(void)

Из Winbase.h.

MSDN

9 голосов
/ 05 марта 2010

Вы можете использовать это в C или C ++

__asm
{
    int 3
}
3 голосов
/ 06 марта 2010

Если вы используете VC6 (да, устаревший, но все еще используется в некоторых местах / проектах), DebugBreak() будет работать, но вы можете оказаться в каком-то непонятном месте в глубине Windows DLL, из которого вам придется пройти по стекуобратно в ваш код.

Вот почему я использую ASSERT() в MFC или assert() в "стандартном" коде.

Ваш пример будет работать так:

n = UnitTest::RunAllTests();
ASSERT(n == 0);
//assert(n == 0);
return n;

Если вам не нужен результат, и вы хотите его только для отладки, вы также можете сделать

if(0 != UnitTest::RunAllTests())
{
    ASSERT(FALSE);
    //assert(false);
}
0 голосов
/ 05 марта 2010

Как часто вы проверяете проект из SVN? Обычно это то, что я делаю только один раз для каждого проекта или когда я перестраиваю свой компьютер.

Если вы также регистрируете файлы проекта, точки останова должны храниться в файлах проекта.

Я думаю, что это в файле .suo. Вы также можете поставить это под контроль SVN, если хотите, хотя я предпочитаю этого не делать.

0 голосов
/ 05 марта 2010

Как насчет использования метода Debug или Trace для вывода информации о консоли. Это может быть лучше, чем полагаться на контрольные точки.

...