Szukam sposobu w .NET (2.0, C# w szczególności) dla kodu źródłowego, aby wywołać przerwę debugowania, jak gdyby punkt przerwania był ustawiony w tym punkcie, bez konieczności pamiętania, aby ustawić konkretny punkt przerwania tam w debugerze i bez ingerencji w środowisko wykonawcze produkcji.Czy kod źródłowy .NET może zakodować twardy punkt debugowania?
Nasz kod musi przełknąć wyjątki w produkcji, aby nie zakłócać aplikacji klienckiej, która łączy się z nami, ale próbuję skonfigurować tak, aby takie błędy pojawiały się, aby zostać przeanalizowane, jeśli tak się stanie uruchomiony w debugerze, w przeciwnym razie zostanie bezpiecznie zignorowany.
Moja próba użycia Debug.Assert(false)
była mniej niż idealna i zakładam, że Debug.Fail()
zachowałoby się w ten sam sposób. Teoretycznie nie powinno to mieć żadnego wpływu na produkcję i kończy się pomyślnie podczas debugowania, ale według projektu (o ile mogę to stwierdzić) nie można kontynuować wykonywania, jeśli chcesz zignorować ten błąd, tak jak przy rzeczywistym punkcie przerwania i tak jak w przypadku produkcji, w której połkniemy błąd. Najwyraźniej również przerywa ocenę stanu zmiennej, ponieważ debugger faktycznie zatrzymuje się w macierzystym kodzie systemowym, a nie w naszym, więc pomoc w debugowaniu jest ograniczona. (Może brakuje mi sposobu na powrót do rzeczy, aby spojrzeć na zmienne i tak dalej, gdzie to się stało?)
Miałem nadzieję na coś takiego jak Debug.Break()
, ale wydaje się, że nie istnieje (chyba że w późniejszej wersji .NET?) i żadne inne metody nie wydają się mieć zastosowania.
Aktualizacja: Chociaż odpowiedź ctacke jest najlepiej pasuje do tego, co szukałem, mam odkąd odkrył również trick z Debug.Assert() - gdy uruchomiony w debugera - Pauza debuggera, przejdź do kod wywołania Debug.Asering (podświetlony na zielono, ponieważ jest w kodzie źródłowym) i naciśnij Step-Out (shift-F11), a następnie naciśnij Ignore w oknie dialogowym potwierdzenia. Spowoduje to wstrzymanie debuggera po powrocie assert (i będzie w stanie kontynuować wykonywanie, jakby nie było, ponieważ zostało zignorowane). Mogą istnieć inne sposoby robienia tego samego (czy uderzenie Spróbuj zrobić to bardziej bezpośrednio?), Ale w ten sposób było intuicyjne.
możesz również użyć #if DEBUG ... #endif zamiast –
Oczywiście, ale jest o wiele brzydszy niż warunkowy, ponieważ musisz zawijać każde wywołanie metody również za pomocą dyrektywy prekompilatora. – ctacke
Aby wyjaśnić, z MSDN: 'Gdy wywoływana jest metoda oznaczona jako warunkowa, obecność lub nieobecność określonego symbolu przetwarzania wstępnego określa, czy wywołanie jest uwzględniane czy pominięte. Jeśli symbol jest zdefiniowany, połączenie jest włączone; w przeciwnym razie wywołanie zostanie pominięte. "oraz" Metoda warunkowa musi być metodą w klasie lub deklaracji struct i musi mieć typ powrotu typu void. " – Kiruse