![]()
Zapewne wszyscy zdają sobie sprawę, że nasz breakpoint możemy uczynić warunkowym tak aby VS zatrzymało się na nim tylko w specyficznej sytuacji a nie za każdym razem. Gdy breakpoint jest warunkowy jego ikona posiada mały biały plusik tak jak na obrazku w tym paragrafie abyśmy mogli odróżnić go od innych. Dziś pokażemy sobie, że warunkowy breakpoint może być użyty także do innych, mniej oczywistych (mam nadzieję) celów.
Załóżmy, że jesteśmy w trakcie debuggowania dość skomplikowanego kodu (ten poniżej takowym nie jest :)).
while (true)
{
int receivedBytes = ReceivePackage();
if (receivedBytes == Package.Length)
{
if (ParsePackage())
break;
}
}
Przetwarzamy sobie w nim jakieś pakiety. Zrobiliśmy już kawał dobrej roboty w identyfikacji i wiemy, że to ten fragment powoduje błędy. Chcemy zmusić aby flow programu przechodził jednak przez gałąź tak jakby if zwracał true. Oczywiście moglibyśmy zakończyć sesję debuggowania, zmienić kod na if (true) lub całkowicie warunek z if usunąć, tylko w jakim celu? Jeśli dość dużo czasu zajęło nam identyfikowanie problemu, lepiej nie ryzykować konieczności wykonania tej pracy raz jeszcze. Ustawmy na nim warunkowy breakpoint. Klikamy zatem na zwykłym breakpoincie PPM i wybieramy Condition…
![]()
Część z osób, które już wcześniej używały dobrodziejstw warunkowych pułapek, może się zdziwić i właśnie krzyczy, że jest błąd: “Tam powinien być znak ==”. Tak, zgoda. W normalnym przypadku tam powinien być znak porównania a nie podstawienia. Ale my nie chcemy normalnego przypadku a ten ciekawy :). Co się stanie w takim przypadku? Tak jak przy zwykłym wykorzystaniu tej funkcji, kod programu będzie wykonywany aż dojdzie do naszej pułapki, zostanie wykonany warunek a ponieważ nie zwróci on prawdy pułapka będzie nieaktywna. Kod wykona się dalej, ale ponieważ w naszym wyrażeniu przypisujemy do zmiennej receivedBytes wartość Package.Length warunek w if będzie prawdziwy i za każdym razem wykona się ParsePackage. Czyż to nie piękne? :) Dla nieznających tej funkcjonalności dodam, że jako warunek można podać w zasadzie dowolne wyrażenie. Chcemy sobie z niego zrobić Tracepoint’a? Nie ma sprawy wystarczy napisać: Console.WriteLine(receivedBytes).I konsola zapełni nam się ładnie danymi... Na plus jest jeszcze to, że działa tam Intellisense, tak więc nie musimy wszystkiego pamiętać.
Mam nadzieję, że pokazałam dość nietypowe zastosowanie warunkowego breakpointa, które może się czasem przydać, aby oszczędzić trochę czasu podczas długich i wycieńczających sesji debuggowania :).

3 komentarze:
Osobiście uważam, że jest to błąd. Już kilka razy zdarzyło mi się bezskutecznie szukać problemu w kodzie, bo był w breakpoincie.
Takie zmiany o których mówisz, powinny być jawnie dokonane w kodzie programu a nie tam gdzie nikt się tego nie spodziewa. Dodatkowo, działa to dużo wolniej. Przy bardziej skomplikowanych algorytmach wolę sam dodać zwykłego IF-a a w nim breaka, właśnie ze względu na czas.
Mimo wszystko dobrze, że zwróciłeś uwagę czytelników na potencjalne źródełko kłopotów.
Osobiście uważam, że jest to pomocne, choć podobnie jak z wieloma innymi rzeczami i tą można sobie zrobić kuku nieumiejętnie jej używając.
Jeśli ktoś będzie w takim warunku wrzucał instrukcje zmianiające kompletnie kod programu a nie tylko if'a to nie ma się co dziwić, że będzie problem z debugowaniem.
Co do prędkości to działa to tak samo szybko jak wrzucenie tam warunku - czyt. wolno.
Faktycznie ciekawe:) Dzięki, może się kiedyś przydać. Czy to błąd czy nie błąd - nie nam oceniać, ale jak już taka funkcjonalność jest (nawet jeśli powstała w wyniku buga) to można z niej pokorzystać.
Prześlij komentarz