Can.NET kod źródłowy hard-code a debugging breakpoint?

Szukam sposobu w. NET (2.0, w szczególności C#), aby kod źródłowy wyzwalał przerwę debugowania, tak jakby ustawiono w tym momencie punkt przerwania, bez konieczności pamiętania o ustawieniu określonego punktu przerwania w debuggerze i bez ingerowania w środowisko wykonawcze produkcji.

Nasz kod musi połykać wyjątki w produkcji, abyśmy nie zakłócali aplikacji klienckiej, która łączy się z nami, ale staram się ją skonfigurować tak, aby takie błędy pojawiały się do analizy, jeśli zdarzy się uruchomiony w debugerze, a w przeciwnym razie będzie bezpiecznie ignorowany.

Moja próba użycia Debug.Assert(false) była mniej niż idealna i zakładam, że Debug.Fail() zachowywałaby się tak samo. Teoretycznie nie powinno to mieć żadnego wpływu na produkcję i z powodzeniem zatrzymuje się podczas debugowania, ale z założenia nie ma (o ile mogę powiedzieć) sposobu na kontynuowanie wykonywania, jeśli chcesz zignorować ten błąd, tak jak w przypadku faktycznego punktu przerwania i tak jak to zrobiłoby w produkcji, gdzie połykamy błąd. To także najwyraźniej przerywa ocenę stanu zmiennej, ponieważ debugger zatrzymuje się w natywnym kodzie systemu, a nie w naszym, więc jego pomoc w debugowaniu jest ograniczona. (Może brakuje mi jakiegoś sposobu na powrót do rzeczy, aby spojrzeć na zmienne i tak dalej, gdzie to się stało. ???)

Liczyłem na coś w rodzaju Debug.Break(), ale wydaje się, że nie istnieje (chyba, że w późniejszej wersji.NET?), a inne metody Debug też nie wydają się odpowiednie.

Update: While ctacke ' s odpowiedź jest najlepszym dopasowaniem do tego, czego szukałem, od tego czasu odkryłem również sztuczkę z debugowaniem.Assert () -- podczas uruchamiania w debuggerze -- Pause the debugger, go to the code for the Debug.Assert wywołanie oczekujące (zaznaczone na zielono, ponieważ jest w kodzie ramki) i naciśnij krok-Out (shift-F11), a następnie naciśnij Ignoruj w oknie dialogowym assert. Spowoduje to wstrzymanie debuggera po powrocie assert (i będzie mógł kontynuować wykonywanie tak, jakby nie miało ono miejsca, ponieważ zostało zignorowane). Mogą być inne sposoby, aby zrobić wiele tego samego (czy uderzenie Retry robi to bardziej bezpośrednio?), ale ten sposób był intuicyjny.

Author: Mogsdad, 2008-12-12

7 answers

Prawdopodobnie szukasz czegoś takiego:

if(System.Diagnostics.Debugger.IsAttached)
  System.Diagnostics.Debugger.Break();

Oczywiście, że nadal będzie skompilowany w Release build. Jeśli chcesz, aby zachowywał się bardziej jak obiekt Debug, w którym kod po prostu nie istnieje w kompilacji Release, możesz zrobić coś takiego:

[Conditional("DEBUG")]
void DebugBreak()
{
  if(System.Diagnostics.Debugger.IsAttached)
    System.Diagnostics.Debugger.Break();
}

Następnie dodaj do niego wywołanie w swoim kodzie.

 120
Author: ctacke,
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
2008-12-12 00:02:20

System.Diagnostyka.Debugger.Przerwa?

 11
Author: shahkalpesh,
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
2008-12-11 23:56:42

Wpadłem kiedyś na sytuację, w której to nie zadziałało.]}

System.Diagnostics.Debugger.Break();

But this did

System.Diagnostics.Debugger.Launch();
 8
Author: CheGueVerra,
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
2008-12-11 23:58:57

Jeśli chcesz mieć tylko jedną linię kodu zamiast 4, zawiń

#if DEBUG
       if (Debugger.IsAttached)
            Debugger.Break();
#endif

Do

public static class DebugHelper
{
    [DebuggerHidden]
    [Conditional("DEBUG")]
    public static void Stop()
    {
       if (Debugger.IsAttached)
            Debugger.Break();
    }
}

I używać

DebugHelper.Stop();

DebuggerHiddenAttribute jest dodawany, aby zapobiec zatrzymaniu się debuggera na wewnętrznym kodzie metody Stop i wejściu do metody z F11.

 6
Author: Sergey,
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
2017-05-27 14:21:34

Może po prostu skonfigurować Visual Studio, aby wyskakiwało z debuggerem, nawet jeśli go połkniesz?

Zrób to:

  • przejdź do Debug- > wyjątki...
  • Znajdź odpowiedni wyjątek lub dodaj go, jeśli jest Twój
  • zaznacz pole wyboru" rzucony " dla wyjątku

Spowoduje to zatrzymanie programu Visual Studio w miejscu, w którym wyrzucany jest wyjątek, a nie tylko jeśli nie jest obsługiwany.

Możesz zobaczyć więcej informacji tutaj .

 4
Author: Lasse Vågsæther Karlsen,
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
2008-12-12 00:02:41

Fajną sztuczką jaką znalazłem jest umieszczenie debuggera.Break() w ctorze Twojego wyjątku.

 3
Author: Jonathan C Dickinson,
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
2008-12-12 08:12:19

W Visual Studio 2010 naciśnięcie Retry w oknie dialogowym Debug.Assert prowadzi do nieudanego twierdzenia debugowania, tak jak gdybyś miał punkt przerwania.

 1
Author: Aren Cambre,
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
2011-11-22 20:52:53