Пошаговое руководство. Отладка многопоточных приложений
Этот раздел применим к:
Выпуск Visual Studio |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
|||||
Pro, Premium и Ultimate |
Visual Studio 2010 предоставляет улучшенное окно Потоки и другие улучшения пользовательского интерфейса для облегчения отладки многопоточных приложений. Выполнение данного пошагового руководства занимает лишь несколько минут, но оно позволит ознакомиться с новыми возможностями интерфейса для отладки многопоточных приложений.
Чтобы начать работу с данным пошаговым руководством, необходим проект многопоточного приложения. Выполните следующие действия для создания этого проекта.
Чтобы создать проект для пошагового руководства
В меню Файл выберите команду Создать и нажмите кнопку Проект.
Откроется диалоговое окно Создание проекта.
В диалоговом окне Типы проекта выберите необходимый язык: Visual Basic, Visual C# или Visual C++.
В окне Шаблоны выберите пункт Консольное приложение или Консольное приложение CLR.
В поле Имя введите "MyThreadWalkthroughApp".
Нажмите кнопку ОК.
Появится новый проект консольного приложения. Когда проект будет создан, откроется файл исходного кода. В зависимости от выбранного языка файл исходного кода может называться Module1.vb, Program.cs или MyThreadWalkthroughApp.cpp
Удалите код, существующий в файле исходного кода, и замените его кодом примера, который рассматривается в подразделе "Создание потока" раздела Создание потоков и передача данных во время запуска.
В меню Файл выберите команду Сохранить все.
Чтобы начать работу над пошаговым руководством
В окне исходного кода найдите следующий код:
Thread.Sleep(3000) Console.WriteLine(
Thread.Sleep(3000);
Console.WriteLine();
Thread::Sleep(3000);
Console.WriteLine();
Начало отладки
Щелкните правой кнопкой мыши инструкцию Console.WriteLine, выберите пункт точка останова а затем команду Вставить точка останова.
В левом переплете окна исходного кода появится красный шар. Это означает, что точка останова установлена в этом месте.
В меню Отладка щелкните Начать отладку.
Начнется отладка, консольное приложение запустится и прервется на точке останова.
Если в этот момент фокус находится на окне консольного приложения, щелкните окно Visual Studio для возвращения фокуса в Visual Studio.
В окне исходного кода найдите строку, содержащую следующий код:
Thread.Sleep(5000)
Thread.Sleep(3000);
Thread::Sleep(3000);
Чтобы обнаружить маркер потока
Щелкните правой кнопкой мыши в окне Потоки и выберите команду Показать потоки в исходном коде.
Посмотрите на переплет в левой части окна. На этой строке появится значок, похожий на 2 тряпичных нити. Одна нить красного цвета, другая — синего. маркер потока указывает, что некий поток остановлен в этом месте. Возможно, в данном месте остановлен наш поток.
Наведите указатель мыши на маркер потока. Появится всплывающая подсказка. Подсказка сообщает имя и идентификационный номер каждого остановившегося тут потока. В нашем случае существует только один поток, имя которого, вероятно, <noname>.
Щелкните правой кнопкой мыши маркер потока. Обратите внимание на варианты выбора в контекстном меню.
Этот значок — маркер потока:
Пометка потоков и ее снятие
В Visual Studio 2008 можно пометить поток, которому следует уделить особое внимание. Пометка потоков — хороший способ отслеживать более важные потоки и игнорировать менее важные.
Чтобы пометить потоки
В меню Вид выберите Панели инструментов.
Убедитесь, что панель инструментов Место отладки выбрана.
Перейдите к панели инструментов Место отладки и щелкните список Поток.
Примечание
Эту панель инструментов можно узнать по трем заметным спискам: Процесс, Поток и Стек вызова.
Обратите внимание, сколько потоков отображается в списке.
Вернитесь в окно исходного кода и снова щелкните правой кнопкой мыши маркер Поток.
В контекстном меню выберите Флаг и затем щелкните имя и ИД потока.
Вернитесь обратно к панели инструментов Место отладки и снова щелкните список Поток.
Теперь в списке отображаются только отмеченные потоки. Кнопка флага находится справа от списка Поток. Значок флага на кнопке ранее был тусклым. Теперь у него ярко–красная окраска.
Наведите указатель мыши на значок флага.
Появится всплывающее окно. Это всплывающее окно сообщает, в каком режиме отображается список Поток: Показывать только отмеченные потоки.
Нажмите кнопку флага для переключения обратно в режим Показывать все потоки.
Снова щелкните список Поток и убедитесь, что теперь снова отображаются все потоки.
Нажмите кнопку флага для переключения обратно в режим Показывать только отмеченные потоки.
В меню Отладка выберите пункт Окна и затем щелкните Потоки.
Появится окно Потоки. К одному потоку прикреплен заметный значок флага.
В окне исходного кода щелкните правой кнопкой мыши маркер потока еще раз.
Обратите внимание, какие варианты сейчас доступны в контекстном меню. Вместо Пометить теперь отображается пункт Снять отметку. Не нажимайте кнопку Снять отметку.
Перейдите к следующему шагу — как снять отметку с потока.
Чтобы снять отметку с потока
В окне Потоки щелкните правой кнопкой мыши строку, соответствующую отмеченному потоку.
Появится контекстное меню. В нем представлены варианты Снять отметку и Снять все отметки.
Чтобы снять отметку с потока, щелкните Снять отметку.
Щелкните значок красного флажка.
Посмотрите на панель инструментов Место отладки еще раз. Кнопка флага снова стала тусклой. Вы сняли отметку с только что отмеченного потока. Поскольку отсутствуют отмеченные потоки, панель инструментов вернулась в режим Показывать все потоки. Щелкните список Поток и убедитесь, что отображаются все потоки.
Вернитесь к окну Потоки и просмотрите колонки сведений.
В верхней части каждой колонки большая часть кнопок имеет заголовки, которые идентифицируют колонку. Однако первый столбец слева не имеет заголовка. Вместо этого он имеет значок, являющийся контуром флага. Можно заметить тот же контур в каждой строке списка потоков. Контур означает, что поток не отмечен.
Щелкните контуры флагов у двух потоков, второго и третьего снизу в списке.
Вместо контуров будут отображаться значки красных флагов.
Нажмите кнопку в заголовке колонки флагов.
Порядок в списке потоков изменился, когда была нажата кнопка. Список потоков теперь отсортирован так, что отмеченные потоки располагаются в верху списка.
Снова нажмите кнопку в заголовке колонки флагов.
Порядок сортировки изменился еще раз.
Дополнительные сведения об окне "Потоки"
Чтобы получить дополнительные сведения об окне "Потоки"
В окне Потоки просмотрите третий столбец слева. Кнопка в верхней части этого столбца называется ID.
Нажмите кнопку ID.
Теперь список потоков отсортирован по идентификатору потока.
Щелкните правой кнопкой мыши любой поток в списке. В контекстном меню выберите команду Шестнадцатеричный вывод.
Формат идентификаторов потоков изменился.
Наведите указатель мыши на любой поток в списке.
После небольшой задержки появится Подсказка Данных. Она отображает частичный стек вызова для этого потока.
Просмотрите четвертый столбец слева, который называется Категория. Потоки делятся на категории.
Первый поток, созданный в процессе, называется "основной поток". Найдите его в списке потоков.
Щелкните правой кнопкой мыши основной поток и выберите Переключиться на поток.
Появится диалоговое окно с предупреждением. Оно сообщает, что Visual Studio не может отобразить исходный код для основного потока.
Нажмите кнопку ОК.
Посмотрите на окно Стек вызовов и панель инструментов Место отладки.
Содержимое окна Стек вызовов изменилось.
Переключение активного потока
Чтобы переключаться между потоками
В окне Потоки просмотрите второй столбец слева. Кнопка в верхней части этого столбца не содержит текста или значка. Этот столбец является столбцом Активный поток.
Просмотрите столбец Активный поток и обратите внимание на то, что у одного потока есть желтая стрелка. Это индикатор активного потока.
Запишите идентификатор потока, на котором установлен индикатор активного потока. Индикатор активного потока будет перемещен на другой поток, но после завершения его необходимо будет вернуть.
Щелкните правой кнопкой мыши другой поток и выберите пункт Переключиться на поток.
Посмотрите на окно Стек вызовов в окне исходного кода. Его содержимое изменилось.
Посмотрите на панель инструментов Место отладки. Здесь активный поток тоже был изменен.
Перейдите к панели инструментов Место отладки. Щелкните поле Поток и выберите другой поток из раскрывающегося списка.
Посмотрите на окно Потоки. Здесь изменился индикатор активного потока.
В окне исходного кода щелкните правой кнопкой мыши маркер потока. В контекстном меню выберите Переключиться на и затем выберите имя или идентификатор потока.
Было рассмотрено три способа изменения активного потока: с помощью окна Потоки, поля Поток в панели инструментов Место отладки, а также индикатора потока в окне исходного кода.
С помощью индикатора потока можно переключаться только на потоки, остановленные в этом конкретном расположении. С помощью окна Потоки и панели инструментов Место отладки можно переключиться на любой поток.
Замораживание и размораживание потоков
Чтобы заморозить и разморозить потоки
В окне Потоки щелкните правой кнопкой мыши любой поток и нажмите кнопку Заморозить.
Посмотрите на столбец "Активный поток". В нем появилась пара вертикальных полос. Эти две синие полосы указывают, что поток заморожен.
Посмотрите на столбец Приостановлен. Счетчик приостановки для потока теперь имеет значение 1.
Щелкните правой кнопкой мыши замороженный поток и выберите команду Разморозить.
Столбцы "Активный поток" и Приостановлен изменятся.
См. также
Задачи
Практическое руководство. Переключение на другой поток при отладке