7

Czy mogę uruchomić program, który intensywnie korzysta z wyjątków w debugerze i nie przechwytuje wyjątków w debugerze?Czy mogę uniknąć powolnych wyjątków .net w DEBUG z załączonym debuggerem?

W szczególności próbuję użyć analizatora składni skryptów TSQL i rozumiem, że it's use of ANTLR is slow in debug mode.

Nie jest to dziwne, jeśli spojrzeć na wyjście debugowania, znajdziesz że jest to spowodowane przez Microsoft® SQL Server® 2012 Transact-SQL ScriptDom parser, ponieważ opiera się na ramach antlr , to rozwija produkcje AST, korzystając z wyjątków, dlatego powoli uruchamia się wewnątrz debuggera.

I całkowicie zrozumieć, że .net wyjątki are slow when thrown

Jak mogę uniknąć powolność podczas pracy ze standardową konfiguracją Debug z debugerem?

  • Wyłączyłem intelitrace.
  • Nie zdefiniowałem stałej DEBUG.
  • Wyłączyłem wiadomości wyjątków w menu Narzędzia> Opcje> Debugowanie> Okno wyników.

Co jeszcze mogę spróbować?

  • Ustawienie CLR Mogę zmienić poprzez app.config?
  • opcja zmiany w Visual Studio?

To jest kod, którego używam do parsowania.

TSqlParser parser = new TSql110Parser(false); 
IList<ParseError> errors; 
TSqlFragment fragment = parser.Parse(new StringReader(sqltext), out errors); 

Po uruchomieniu za pomocą CTRL + F5 kończy się szybko, a przy użyciu F5 (dołączony debugger), rezygnuję z czekania.

+0

można spróbować umieścić punkt przerwania, odłączeniu debugger, a następnie robi [ 'Debugger.Launch()'] (https://msdn.microsoft.com/en-us/library/system. diagnostics.debugger (v = vs.110) .aspx) po zakończeniu analizy. Jeśli to działa, opublikuję to jako odpowiedź. –

+0

@ScottChamberlain jest sposobem obejścia tego kodu, który zgłasza wyjątki. Powinieneś przenieść pytanie do odpowiedzi, ponieważ jest to poprawne rozwiązanie, ale nie odpowiada, jeśli debugger ma ustawienie, które można zmienić, czy też nie. W tym przypadku wyłączam debuggera, aby obejść ten problem. – JJS

Odpowiedz

4

Nie można zatrzymać wyjątki i pierwsze wyjątki szansę są powolne pod debugger jako proces jest wstrzymane, operacja przenosi się nad do debuggera powiedzieć, czy chce o tym wiedzieć, czy nie, następnie klient jest ponownie uruchamiany (do następnego). Tak właśnie działa Win32 Debug Api.

Zrobiłem sporo debugowania ScriptDom i najlepsze, co wymyśliłem, to parsowanie małych skryptów, które są dobrze sformułowane i poprawne.

Próbuję ograniczyć skrypt do części, która ma problem.

ed

+0

Czy możesz podać cytat za odpowiedź od sprzedawcy? http://blogs.msdn.com/b/visualstudioalm/archive/2015/03/03/make-debugging-faster-with-visual-studio.aspx - w nagłówku Duża liczba wyjątków była dokładnie tym, czego szukałem dla. – JJS

+0

aby wyjaśnić, masz na myśli cytat, dlaczego wyjątki pierwszej szansy są powolne lub dlaczego istnieje wiele wyjątków pierwszej szansy? –

+0

w szczególności zachowanie procesu wstrzymanego, zgłoszone w debugerze, a następnie wznowione. Nie mam metody profilowania tego, ale zakładam, że to właśnie powoduje spowolnienie. Mój link w poprzednim komentarzu określa, że ​​jest to jeden z powodów spowolnienia. – JJS

2

To nie jest tak naprawdę .NET wyjątki, które są powolne, chociaż nie są one dokładnie demonem prędkości. Możesz rzucić gruby dziesięć tysięcy, zanim stracisz sekundę swojego życia. To w rzeczywistości twój debugger jest powolny. Sumarycznie zgłasza wyjątek w oknie wyjściowym, co jest dość kosztowne.

Bardzo łatwa do naprawienia, kliknij prawym przyciskiem myszy okno podczas debugowania i odznaczania "Komunikaty o wyjątkach". Możesz ustawić to ustawienie na stałe za pomocą Narzędzia> Opcje> Debugowanie> Okno wyników.

Jeśli nadal trzeba czekać zbyt długo, należy debugować kod za pomocą małych zestawów danych, aby po prostu nie trzeba było czekać na zawsze. Szanse, że kod nie powiedzie się na 100 000, ale nie na 100 pozycji danych, są drastycznie niskie. Ważne jest, abyś przetestował swoją aplikację pod kątem obsługi dużych ilości danych, aby sprawdzić, czy jest w stanie skalować. Ale robisz to tylko w wersji Release bez dołączonego debuggera.

+0

Próbowałem już wyłączyć komunikaty wyjściowe dla wyjątków. Zaktualizowałem pytanie, aby to odzwierciedlić. – JJS

+0

podnosisz poprawny punkt. Tylko debugowanie ze złymi danymi. To jest obejście problemu i nie odpowiada na moje oryginalne pytanie, jak sprawić, by debugger nie zwolnił w obliczu wyjątków. – JJS

+0

? Hmya? Zdaję sobie sprawę, że mogę prosić o kucyka. Jeśli tak, chciałbym, aby była to ostateczna dokumentacja, że ​​jest to jednorożec i nie można go mieć. – JJS

6

Możliwe obejście problemu (podczas pracy z podobnym problemem, w którym biblioteka przetwarzająca obraz wyrzuciła OutOfMemoryException, jeśli był używany podczas debuggowania na szczególnie dużym zbiorze danych), należy podać punkt przerwania przed wywołaniem do 3 kod biblioteki partyjnej i odłączenie debuggera, po tym, jak punkt przerwania ponownie załączył debugger za pomocą Debugger.Launch().

#if DEBUG 
bool debuggerAttached = Debugger.IsAttached; 
if(debuggerAttached) 
{ 
    Debugger.Break(); //Detach the debugger to make the next section faster. 
} 
#endif 

TSqlParser parser = new TSql110Parser(false); 
IList<ParseError> errors; 
TSqlFragment fragment = parser.Parse(new StringReader(sqltext), out errors); 

#if DEBUG 
if(debuggerAttached && !Debugger.IsAttached) 
{ 
    Debugger.Launch(); 
} 
#endif 
+0

@ScottChamerlain - świetny przykład kodu demonstrujący obejście tego problemu. Świetne wykorzystanie symboli pre-kompilatora! Dzięki za przyczynienie się. – JJS