Szél Péter

Könnyen előfordulhat olyan eset, hogy nem közvetlenül Te indítod el az alkalmazásodat, hanem egy másik program. Az egyik leggyakoribb eset, ha egy automatizált tesztet készítesz, amely a megfelelő előkészületek után például egy Process.Start() hívással elindítja az alkalmazásodat, majd miután lefutott, különböző feltételeket támaszt a világgal szemben, hogy eldöntse: sikeres volt-e a futtatás.

Tipikusan ez történik:

  • Elindítod a tesztet
  • Felbukkan az alkalmazásod ablaka
  • Hiba nélkül leáll a programod viszont a teszted elbukik

Persze amikor kézzel próbálod megfuttatni az alkalmazásodat, a hiba nem jelentkezik, tőkéletesen működik minden. Lehetséges, hogy az alkalmazásod logjaiból ki tudod mazsolázni a hiba okát, de jó eséllyel nem lesz ilyen egyszerű a dolgod, mivel

a) nem keletkezett kivétel a futás során, így nem tudod egyértelműen azonosítani a problémás pontot

b) a keletkezett kivétel érthetetlen/haszontalan információval szolgál, és a további vizsgálathoz arra volna szükséged, hogy bele tudj nézni a változók tartalmába.

A Visual Studio debuggert nem tudod egyszerűen csatlakoztatni, hiszen nem Te indítod az alkalmazást és nem is egy hosszan futó alkalmazásról van szó, amelyhez bármikor csatlakozhatsz. Ekkor jön segítségül a Windows beépített szolgáltatása, amely segít csatlakoztatni a debugger alkalmazást. Így fest C# kódban:

public void Run() {  
#if DEBUG
    Debugger.Launch();
#endif
    // let magic happen
}

A kulcs a fenti kódban a Debugger.Launch(); hívás, amitől a csoda történik. Természetesen ezt a részt körbevettem #if DEBUG direktívával, hiszen nem szeretném, hogy éles környezetben is aktiválódjon a kód.

Ekkor nyugodtan indíthatod a tesztet, amikor az alkalmazásod a fenti ponthoz érkezik, előbukkan egy ablak:

Majd a megfelelő debugger alkalmazást kiválasztva és a "Yes" gombra kattintva már ott is vagy, ahol lenni szeretnél:

Ettől a ponttól kezdve oda teszed a breakpointot, ahova szeretnéd, könnyen tudsz a kódban navigálni és debuggolni.
Így már sokkal egyszerűbb lesz az életed! :)