Опубликован: 23.01.2013 | Уровень: для всех | Доступ: платный | ВУЗ: Томский политехнический университет
Самостоятельная работа 10:

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

Аннотация: В рамках данного практического занятия, будет рассмотрен пример отладки параллельного приложения, с использованием окна вызова стеков.

  1. Создадим новое консольное приложение - "ParallelStackApplication":
  2. Скопируем код в созданный проект:
    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();
            }
        }
    }
  3. Запустите отладку программы с помощью кнопки "Start Debbuging" из меню Visual Studio "Debug" или с помощью клавиши "F5":
  4. Через несколько секунд курсор отладчика должен остановиться на методе Debbuger.Break():
  5. Запустите окно параллельных стеков (Parallel Stacks) из меню "Debug -> Windows" или с помощью сочетания клавиш "Ctrl+Shift+D,S":
  6. В результате должно отобразиться "дерево" потоков:
  7. Переключимся на метод класса XClass - MС(). Для этого кликните правой кнопкой мыши по данному методу и выберите из списка "Switch To Frame" и установите флажок напротив значения 6568:
  8. После чего Visual Studio перейдет на данный фрагмент кода:
  9. В примере программы используется метод Debbuger.Break(), который позволяет останавливать отладку в нужной точке. Для того, что бы отладка программы выполнялась по шагам, расставим точки останова (breakpoints) напротив нескольких методов:
  10. Запустим отладчик. В результате программа будет осуществлять отладку по шагам и соответствующие изменения (в зависимости от шага) - будут отображаться в окне вызова стеков:
  11. Для завершения процесса отладки используется пункт из меню "Debug" - "Stop Debugging" или сочетание клавиш "Shift+F5":

    Рис. 22.10.
Владимир Каширин
Владимир Каширин

Вопрос по Курсу: "Параллельное программирование с использованием MS VisualStudia 2010".

При компиляции Самостоятельного задания (одновременная отрисовка прямоугольников, эллипсов и выдача в текст-бокс случайного числа) среда предупреждает: suspend - устаревшая команда; примените monitor, mutex и т.п.

Создаётся впечатление, что Задание создано в более поздней среде, чем VS 2010.

Александр Гаврилов
Александр Гаврилов
Россия
Роман Дмитриев
Роман Дмитриев
Россия, Москва