Soci (Soczó Zsolt) szakmai blogja

2006.04.28.

Deadlock detektálás .NET Appokban

Filed under: .NET,Szakmai élet — Soczó Zsolt @ 12:02

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.

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress