Visual Studio-czy może być punktem przerwania wywoływanym z kodu?

Mam projekt testów jednostkowych oparty na UnitTest++. Zazwyczaj umieszczam punkt przerwania w ostatniej linii kodu, aby móc sprawdzić konsolę, gdy jeden z testów zawiedzie:

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

Ale muszę go ponownie włożyć za każdym razem, gdy sprawdzam kod NA NOWO Z SVN. Czy możliwe jest nieco umieścić punkt przerwania przez kompilator?:

      n = UnitTest::RunAllTests();
      if ( n != 0 )
      {
      // place breakpoint here    
#ifdef __MSVC__
        @!!!$$$??___BREAKPOINT;
#endif
        return n;
      }
      return n;
Author: Gregory Pakosz, 2010-03-05

6 answers

Użyj __debugbreak() intrinsic(wymaga włączenia <intrin.h>).

Użycie __debugbreak() jest lepsze od bezpośredniego zapisu __asm { int 3 }, ponieważ składanie w wierszu nie jest dozwolone podczas kompilacji kodu dla architektury x64.

I dla przypomnienia, na Linuksie i Macu, z GCC, używam __builtin_trap().

 55
Author: Gregory Pakosz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-25 09:34:55
DebugBreak(void)

Z Winbase.h.

MSDN

 18
Author: Clinton Pierce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-05 19:16:36

Możesz użyć tego w C lub C++

__asm
{
    int 3
}
 7
Author: Indy9000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-06 09:15:54

Jeśli używasz VC6 (tak, przestarzały, ale nadal używany w niektórych miejscach/projektach), DebugBreak() zadziała, ale możesz skończyć w jakimś niejasnym miejscu głęboko w bibliotekach DLL Windows, z których musisz przejść stos z powrotem do kodu.

Dlatego używam ASSERT() w MFC lub assert() w" standardowym " kodzie.

Twój przykład działa tak:

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

Jeśli nie potrzebujesz wyniku i chcesz go tylko do debugowania, możesz również zrobić

if(0 != UnitTest::RunAllTests())
{
    ASSERT(FALSE);
    //assert(false);
}
 3
Author: foraidt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-06 09:31:27

Co powiesz na użycie metody debugowania lub śledzenia, aby wyświetlić informacje o konsoli. Może to być lepsze podejście niż poleganie na punktach przerwania.

 0
Author: Cody C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-05 19:14:22

Jak często sprawdzasz projekt z SVN? Zazwyczaj jest to coś, co robię tylko raz na projekt lub gdy przebudowuję mój komputer.

Jeśli sprawdzasz również pliki projektu, punkty przerwania powinny być przechowywane w plikach projektu.

Myślę, że jest w .plik suo. Możesz również umieścić to pod kontrolą SVN, jeśli chcesz, choć wolę nie.

 0
Author: codenheim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-05 19:16:08