Java konzolban a CTRL-Backspace kilistázza a szálak állapotát, azt is, ha némelyik áll deadlock miatt, és ilyenkor az is látszik, hogy melyik szinkronizációs primitíveken álltak meg a szálak. (Nem láttam még, mondták.)
Jó lenne ilyen .NET-ben is, de alapban nincs. De megoldható. A 2.0-s fw-ben alaposan kibővítették a CLR hosting interfészt, így a CLR-t explicit betöltő nem menedzselt processzek sok mindenben bele tudnak szólni a CLR életébe. Az egész az SQL Server 2005 CLR támogatás miatt került be a .NET-be, de most ne politizáljunk.
Például amikor egy Monitor.Lock kénytelen Windows szinkronizációs primitívet használni, mert tényleg több szál akar bejutni a kritikus szekcióba, akkor a CLR kiszólhat a hosthoz, hogy adjál már nekem egy Eventet (ez nem a .NET event, ez egy Windows szinkronizációs primitív). Ekkor a host feljegyezheti melyik szál milyen lockot kért, így külön szálon észre tudja venni, ha körkörös várakozások alakulnak ki, azaz deadlock van a programban. Okos, nem?
Az egész egy kész, használható kis programmal együtt ki van dolgozva egy msdn magazin cikkben. Csak el kell indítani a detektáló programot, paraméterként átadva a megfigyelendő programot, és szépen kiírja, amikor deadlockot talál, a program pedig megél egy deadlockról tájékoztató exceptiont. Ügyes, de tényleg.
Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.