Debugowanie aplikacji wielowątkowych: Parralel Stacks

W ostatnim wpisie pokazałem jak debugować kod .NET Framework w VS2008. Wciąż próbuje wyjaśnić w jakich wersjach to działa a w jakich nie. W następnym wpisie mam nadzieję, że wspomnę jak sprawa wygląda z VS 2010 i VS2012.

Wątki w aplikacjach są dziś już nieodłącznym elementem. Wprowadzenie async\await jeszcze bardziej upowszechniło i ułatwiło pisanie kodu wykonywanego równolegle. W przypadku, gdy aplikacja wielowątkowa zachowuje się podejrzanie, znalezienie błędu może być bardzo trudnym wyzwaniem. Visual Studio ułatwia debugowanie poprzez dostarczenie kilku mechanizmów. Najpopularniejszy to okno Threads, zawierające listę wszystkich wątków. Załóżmy, że mamy kod, w którym jeden z wątków blokuje dostęp do zasobów współdzielonych:

 

class Program
{
   private readonly static object _Sync=new object();

   static void Main(string[] args)
   {

       for (int i = 0; i < 50; i++)
       {
           Task.Factory.StartNew(() =>
           {
               lock (_Sync)
               {
                   Thread.Sleep(5000000);
               }
           });
       }
       Console.ReadLine();
   }
}

Pierwszym, najpopularniejszym ułatwieniem w VS jest okno Threads, zawierające listę wykonywanych wątków:

image

Jest chyba one bardzo dobrze znane więc nie będę za wiele tutaj pisał. W poście chciałem jednak pokazać bardziej interesujący mechanizm, a mianowicie Parralel Stacks, które można otworzyć z Debug->Windows:

image

W oknie widać dokładnie jakie wątki zostały utworzone, kiedy i w jakiej są relacji do siebie. Można zaobserwować również, że jeden z 50 utworzonych wątków, wywołał funkcje Thread.Sleep. W taki sposób, nie trudno domyślić się, dlaczego pozostałe wątki nie zakończyły zadania.

Mechanizm naprawdę pomocny szczególnie w aplikacjach co mają >100 wątków. Dzięki temu, łatwo zaobserwować gdzie i kiedy wątki są tworzone.

Leave a Reply

Your email address will not be published.