Jakiś czas temu straciłem dwa dni na znalezienie prostego błędu. Został on popełniony całkowicie nieświadomie. Zresztą jak większość błędów. Zachowanie aplikacji było całkiem nietypowe – po otworzeniu program się po prostu zamykał. Pewnie zadajecie sobie pytanie, co w tym nietypowego. Otóż po podpięciu debuggera pod aplikację nie otrzymywaliśmy ani jednej wskazówki, co może być nie tak. Aplikacja po prostu zamykała się, a debugger zostawał odpinany od programu.
Błąd spowodowany został przez drobną literówkę. Otóż okazuje się, że zrobienie niekończącej się rekurencji nie jest w żaden sposób wyłapywane przez kompilator. W moim programie zamiast małej litery pojawiła się duża w deklaracji właściwości klasy:
private string test; public string Test { get { return this.Test; } set { if (this.test != value) { this.test = value; this.NotifyPropertyChanged(m => m.Test); } } } }
Zamiast:
return this.test;
pojawiło się:
return this.Test;
Błąd trywialny, którego poprawienie powinno zająć kilka sekund. Problem wystąpił jednak z jego znalezieniem. Do momentu wystąpienia tej sytuacji przyzwyczajony byłem to tego, że w momencie wystąpienia niekończącej się rekurencji pojawiał się zawsze wyjątek mówiący o przepełnieniu stosu. I wiadomo było, czego szukać. A tym czasem błędne miejsce w kodzie znalazłem całkiem przypadkowo.
W przypadku dziwnych błędów warto czasem zajrzeć do EventLog’a Windows’a są one przeważnie tam zapisywabe. Mnie to kilka razy uratowało przed żmudnym przeglądaniem wszystkiego 🙂
Pod warunkiem, że piszesz soft pod Windowsa. W przypadku Windows Phona nie ma dostępu do takich zabawek 🙂 .