Основы параллельного программирования с использованием Visual Studio 2010

Отладка многопоточного приложения с использованием окна стеков

Показывать лекцию целиком
  • Создадим новое консольное приложение - "ParallelStackApplication": (рис 22.1)
  • Скопируем код в созданный проект:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Diagnostics;
    namespace ParallelStacksApplication
    {
        class XClass
        {
            public void MA(object param) { MB(param); }
            public void MB(object param) { MC(param); }
            object s1 = new object();
            object s2 = new object();
            public void MC(object param)
            {
                if (param == "1")
                {
                    MD();
                }
                if (param == "2")
                {
                    ME();
                }
                if (param == "3")
                {
                    MF();
                }
            }
            public void MD()
            {
                ME();
            }
            public void ME()
            {
                while (true) Thread.SpinWait(int.MaxValue / 20);
            }
            public void MF()
            {
                ML();
            }
            public void MG(object param)
            {
                MH(param);
            }
            public void MH(object param)
            {
                MI(param);
            }
            public void   MI(object  param)
            {
                if (param == "4")
                {
                    MJ();
                }
                else
                {
                    MK();
                }
            }
            public void MJ()
            {
                Monitor.Enter(s1); Thread.SpinWait(int.MaxValue / 20); Monitor.Enter(s2);
            }
            public void MK()
            {
                Monitor.Enter(s2); 
                Thread.SpinWait(int.MaxValue / 10);
                Monitor.Enter(s1);
            }
            public void ML()
            {
                MM();
            }
            public void MM()
            {
                while (true) 
                { Thread.SpinWait(int.MaxValue / 3);
                  Debugger.Break();
                };
            }
        }
        class Program
        {
            static XClass obj = null;
            static void Main(string[] args)
            {
                obj = new XClass();
                Task.Factory.StartNew(obj.MA, "1"); 
                Task.Factory.StartNew(obj.MA, "2"); 
                Task.Factory.StartNew(obj.MA, "3");
                Task.Factory.StartNew(obj.MG, "4"); 
                Task.Factory.StartNew(obj.MG, "5");
                Console.ReadLine();
            }
        }
    }
  • Запустите отладку программы с помощью кнопки "Start Debbuging" из меню Visual Studio "Debug" или с помощью клавиши "F5": (рис 22.2)
  • Через несколько секунд курсор отладчика должен остановиться на методе Debbuger.Break(): (рис 22.3)
  • Запустите окно параллельных стеков (Parallel Stacks) из меню "Debug -> Windows" или с помощью сочетания клавиш "Ctrl+Shift+D,S": (рис 22.4)
  • В результате должно отобразиться "дерево" потоков: (рис 22.5)
  • Переключимся на метод класса XClass - MС(). Для этого кликните правой кнопкой мыши по данному методу и выберите из списка "Switch To Frame" и установите флажок напротив значения 6568: (рис 22.6)
  • После чего Visual Studio перейдет на данный фрагмент кода: (рис 22.7)
  • В примере программы используется метод Debbuger.Break(), который позволяет останавливать отладку в нужной точке. Для того, что бы отладка программы выполнялась по шагам, расставим точки останова (breakpoints) напротив нескольких методов: (рис 22.8)
  • Запустим отладчик. В результате программа будет осуществлять отладку по шагам и соответствующие изменения (в зависимости от шага) - будут отображаться в окне вызова стеков: (рис 22.9)
  • Для завершения процесса отладки используется пункт из меню "Debug" - "Stop Debugging" или сочетание клавиш "Shift+F5": (рис 22.10)
  • Вернуться к учебному плану