Система Orphus

Отладка приложений Microsoft .NET и Microsoft Windows

Автор: Джон Роббинс
Издательство: Русская Редакция, 2004
736 страниц

Материал предоставил: Алексей Кирюшкин
Найти в магазинах
Купить в Озоне (504 руб.)
Купить в Books.Ru
Купить в My-Shop.ru (468 руб.)

Аннотация

Содержание
Введение
Комментарии

Аннотация

В книге рассказывается о мощных и практичных методах отладки приложений Microsoft Windows и устранения даже самых "противных" неполадок. В это издание автор добавил описание новых способов и подходов к отладке приложений Microsoft .NET - от Web-сервисов и ASP.NET до удаленного вызова процедур и Windows Forms. На прилагаемом компакт-диске вы найдете примеры приложений, разработанных в самых различных средах - Microsoft Visual C++, Visual C++ .NET, Visual C#, Microsoft Visual Basic и Visual Basic .NET.

Содержание

Благодарности
Введение
Для кого эта книга?
Как читать эту книгу и что нового во втором издании
Требования к системе ...
Файлы примеров
Обратная связь
Служба поддержки Microsoft Press

ЧАСТЬ I СУЩНОСТЬ ОТЛАДКИ

Глава 1 Ошибки в программах: откуда они берутся и как с ними бороться?

Ошибки и отладка
Что такое программные ошибки?
Обработка ошибок и решения
Планирование отладки
Необходимые условия отладки
Необходимые навыки
Выработка мастерства
Процесс отладки
Шаг 1. Воспроизведи ошибку
Шаг 2. Опиши ошибку
Шаг 3. Всегда предполагай, что ошибка твоя
Шаг 4. Разделяй и властвуй
Шаг 5. Мысли творчески
Шаг 6. Усиль инструментарий
Шаг 7. Начни интенсивную отладку
Шаг 8. Проверь, что ошибка устранена
Шаг 9. Научись и поделись
Последний секрет отладки

Глава 2 Приступаем к отладке

Следите за изменениями проекта вплоть до его окончания
Системы управления версиями
Системы отслеживания ошибок
Выбор правильных систем
Планирование времени построения систем отладки
Создавайте все компоновки с использованием символов отладки
При работе над управляемым кодом рассматривайте предупреждения как ошибки
При работе над неуправляемым кодом рассматривайте предупреждения как ошибки (в большинстве случаев)
Разрабатывая неуправляемый код, знайте адреса загрузки DLL
Как поступать с базовыми адресами управляемых модулей?
Разработайте несложную диагностическую систему для заключительных компоновок
Частые сборки программы и дымовые тесты обязательны
Частые сборки
Дымовые тесты
Работу над программой установки следует начинать немедленно
Тестирование качества должно проводиться с отладочными компоновками
Устанавливайте символы ОС и создайте хранилище символов
Исходные тексты и серверы символов

Глава 3 Отладка при кодировании

Assert, Assert, Assert и еще раз Assert
Как и что утверждать
Утверждения в .NET Windows Forms или консольных приложениях
Утверждения в приложениях ASP.NET и Web-сервисах XML
Утверждения в приложениях C++
Различные типы утверждений в Visual C++
assert, _ASSERT и _ASSERTE
ASSERTKINDOF и ASSERTVALID
Главное в реализации SUPERASSERT
Trace, Trace, Trace и еще раз Trace
Трассировка в Windows Forms и консольных приложениях .NET
Трассировка в приложениях ASP.NET и Web-сервисах XML
Трассировка в приложениях C++
Комментировать, комментировать и еще раз комментировать
Доверяй, но проверяй (Блочное тестирование)

ЧАСТЬ II ПРОИЗВОДИТЕЛЬНАЯ ОТЛАДКА

Глава 4 Поддержка отладки ОС и как работают отладчики Win32

Типы отладчиков Windows
Отладчики пользовательского режима
Отладчики режима ядра
Поддержка отлаживаемых программ операционными системами Windows
Отладка Just-In-Time (JIT)
Автоматический запуск отладчика (опции исполнения загружаемого модуля)
MiniDBG - простой отладчик Win32
WDBG - настоящий отладчик
Чтение памяти и запись в нее
Точки прерывания и одиночные шаги
Таблицы символов, серверы символов и анализ стека
Шаг внутрь, Шаг через и Шаг наружу
Итак, вы хотите написать свой собственный отладчик
Что после WDBG?

Глава 5 Эффективное использование отладчика Visual Studio .NET

Расширенные точки прерывания
Подсказки к точкам прерывания
Быстрое прерывание на функции
Модификаторы точек прерывания по месту
Несколько точек прерывания на одной строке
Окно Watch
Вызов методов в окне Watch
Команда Set Next Statement

Глава 6 Улучшенная отладка приложений .NET в среде Visual Studio .NET

Усложненные точки прерывания для программ .NET
Условные выражения
Окно Watch
Автоматическое развертывание собственных типов
Советы и хитрости
DebuggerStepThroughAttribute и DebuggerHiddenAttribute
Отладка в смешанном режиме
Удаленная отладка
ILDASM и промежуточный язык Microsoft
Начинаем работу с ILDASM
Основы CLR
MSIL, локальные переменные и параметры
Важные команды
Другие инструменты восстановления алгоритма

Глава 7 Усложненные технологии неуправляемого кода в Visual Studio .NET

Усложненные точки прерывания для неуправляемого кода
Усложненный синтаксис точек прерывания
Точки прерывания в системных и экспортируемых функциях
Условные выражения
Точки прерывания по данным
Окно Watch
Форматирование данных и вычисление выражений
Хронометраж кода в окне Watch
Недокументированные псевдорегистры
Автоматическое разворачивание собственных типов
Удаленная отладка
Советы и уловки
Отладка внедренного кода
Окно Memory и автоматическое обновление
Контроль исключений
Дополнительные советы по обработке символов
Отключение от процессов Windows 2000
Обработка дамп-файлов
Язык ассемблера х86
Основы архитектуры процессоров
Кое-какие сведения о встроенном ассемблере Visual C++ .NET
Команды, которые нужно знать
Частая последовательность команд: вход в функцию и выход из функции
Вызов процедур и возврат из них
Соглашения вызова
Доступ к переменным: глобальные переменные, параметры и локальные переменные
Дополнительные команды, которые нужно знать
Манипуляции со строками
Распространенные ассемблерные конструкции
Ссылки на структуры и классы
Полный пример
Окно Disassembly
Исследование стека "вручную"
Советы и хитрости

Глава 8 Улучшенные приемы для неуправляемого кода с использованием WinDBG

Прежде чем начать
Основы
Что случается при отладке
Получение помощи
Обеспечение корректной загрузки символов
Процессы и потоки
Общие вопросы отладки в окне Command
Просмотр и вычисление переменных
Исполнение, проход по шагам и трассировка
Точки прерывания
Исключения и события
Управление WinDBG
Магические расширения
Загрузка расширений и управление ими
Важные команды расширения
Работа с файлами дампа
Создание файлов дампа
Открытие файлов дампа
Отладка дампа
Son of Strike (SOS)
Использование SOS

ЧАСТЬ III МОЩНЫЕ СРЕДСТВА И МЕТОДЫ ОТЛАДКИ ПРИЛОЖЕНИИ .NET

Глава 9 Расширение возможностей интегрированной среды разработки Visual Studio .NET

Расширение IDE при помощи макросов
Параметры макросов
Проблемы с проектами
Элементы кода
CommenTater: лекарство от распространенных проблем?
Введение в надстройки
Исправление кода, сгенерированного мастером Add-In Wizard
Решение проблем с кнопками панелей инструментов
Создание окон инструментов
Создание на управляемом коде страниц свойств окна Options
Надстройка SuperSaver
Надстройка SettingsMaster
Вопросы реализации SettingsMaster
Будущие усовершенствования SettingsMaster

Глава 10 Мониторинг управляемых исключений

Введение в Profiling API
Запуск средства профилирования
ProfilerLib
ExceptionMon
Внутрипроцессная отладка и ExceptionMon
Использование исключений в .NET

Глава 11 Трассировка программы

Установка ловушек при помощи Profiling API
Запрос уведомлений входа и выхода
Реализация функций-ловушек
Встраивание
Преобразователь идентификаторов функций
Использование FlowTrace
Некоторые сведения о реализации FlowTrace
Что после FlowTrace

ЧАСТЬ IV МОЩНЫЕ СРЕДСТВА И МЕТОДЫ ОТЛАДКИ НЕУПРАВЛЯЕМОГО КОДА

Глава 12 Нахождение файла и строки ошибки по ее адресу

Создание и чтение МАР-файла
Содержание МАР-файла
Получение информации об исходном файле, имени функции и номере строки
PDB2MAP: создание МАР-файлов постфактум
Использование CrashFinder
Некоторые сведения о реализации
Что после CrashFinder?

Глава 13 Обработчики ошибок

Структурная обработка исключений против обработки исключений C++
Структурная обработка исключений
Обработка исключений C++
Избегайте использования обработки исключений C++
API-функция SetUnhandledExceptionFilter
Использование API CrashHandler
Преобразование структур EXCEPTION_POINTERS
Минидампы
API-функция MiniDumpWriteDump
Укрощение MiniDumpWriteDump

Глава 14 Отладка служб Windows и DLL, загружаемых в службы

Основы служб
API
Защита
Отладка служб
Отладка базового кода
Отладка службы

Глава 15 Блокировка в многопоточных приложениях

Советы и уловки, касающиеся многопоточности
Не используйте многопоточность
Не злоупотребляйте многопоточностью
Делайте многопоточными только небольшие изолированные фрагменты программы
Выполняйте синхронизацию на как можно более низком уровне
Работая с критическими секциями, используйте спин-блокировку
Не используйте функции CreateThread/ExitThread
Опасайтесь диспетчера памяти по умолчанию
Получайте дампы в реальных условиях
Уделяйте особое внимание обзору кода
Тестируйте многопоточные приложения на многопроцессорных компьютерах
Требования к DeadlockDetection
Общие вопросы разработки DeadlockDetection
Использование DeadlockDetection
Реализация DeadlockDetection
Перехват импортируемых функций
Детали реализации
Что после DeadlockDetection?

Глава 16 Автоматизированное тестирование

Проклятие блочного тестирования: UI
Требования к Tester
Использование Tester
Сценарии Tester
Запись сценариев
Реализация Tester
Уведомления и воспроизведение файлов в TESTER.DLL
Реализация TESTREC.EXE
Что после Tester?

Глава 17 Стандартная отладочная библиотека С и управление памятью

Особенности стандартной отладочной библиотеки С
Использование стандартной отладочной библиотеки С
Ошибка в DCRT
Полезные функции DCRT
Выбор правильной стандартной отладочной библиотеки С для вашего приложения
Использование MemDumperValidator
Использование MemDumperValidator в программах C++
Использование MemDumperValidator в программах С
Глубокая проверка
Реализация MemDumperValidator
Инициализация и завершение в программах C++
И куда же подевались все сообщения об утечках памяти?
Использование MemStress
Интересные проблемы с MemStress
Кучи операционной системы
Советы по отслеживанию проблем с памятью
Обнаружение записи в неинициализированную память
Нахождение записи данных после окончания блока
Потрясающие ключи компилятора
Ключи проверки ошибок в период выполнения
Ключ проверки безопасности буфера

Глава 18 FastTrace: высокопроизводительная утилита трассировки серверных приложений

Фундаментальная проблема и ее решение
Использование FastTrace
Объединение журналов трассировки
Реализация FastTrace

Глава 19 Утилита Smooth Working Set

Оптимизация рабочего набора
Работа с SWS
Настройка компиляндов SWS
Выполнение приложений вместе с SWS
Генерирование и использование файла порядка
Реализация SWS
Функция _penter
Формат файла .SWS и перечисление символов
Период выполнения и оптимизация
Что после SWS?

ЧАСТЬ V ПРИЛОЖЕНИЯ

Приложение А Чтение журналов Dr. Watson
Журналы Dr. Watson

Приложение Б Ресурсы для разработчиков приложений .NET и Windows
Книги
Разработка ПО
Отладка и тестирование
Технологии .NET
Языки C/C++
ОС Windows и технологии Windows
Процессоры Intel и аппаратные средства ПК
Программные средства
Web-сайты

Предметный указатель
Об авторе

Введение

Джон Роббинс

Ошибки - жуткая гадость. Многоточие... Ошибки являются причиной обреченных на гибель проектов с сорванными сроками, ночными бдениями и опостылевшими коллегами. Ошибки могут превратить вашу жизнь в кошмар, поскольку, если изрядное их число затаится в вашем продукте, пользователи могут прекратить его применение, и вы потеряете работу. Ошибки - серьезный бизнес.

Много раз люди из нашей среды называли ошибки всего лишь досадным недоразумением. Это утверждение далеко от истины, как никакое другое. Любой разработчик расскажет вам о проектах с немыслимым количеством ошибок и даже о компаниях, загнувшихся оттого, что их продукт содержал столько ошибок, что был непригоден. Когда я писал первое издание этой книги, NASA потеряла космический зонд, направленный на Марс, из-за ошибок, допущенных при выработке требований и проектировании ПО. Во время написания данного издания на солдат американского спецназа упала бомба, направленная на другую цель. Причиной была программная ошибка, возникшая при смене источника питания в системе наведения. По мере того как компьютеры управляют все более ответственными системами, медицинскими устройствами и сверхдорогой аппаратурой, программные ошибки вызывают все меньше улыбок и не рассматриваются как нечто самой собой разумеющееся.

Я надеюсь, что эта книга прежде всего поможет вам узнать, как писать программы с минимальным числом ошибок и отлаживать их побыстрее. При правильном подходе вы сэкономите на отладке массу времени. Речь не идет о выработке требований и проектировании, но отлаживать вы наверняка научитесь более грамотно. В этой книге описывается интегральный подход к отладке. Я рассматриваю отладку не как отдельный шаг, а как составную часть общего цикла производства ПО. Я считаю, что ее следует начинать на этапе выработки требований и продолжать вплоть до стадии производства.

Две вещи делают отладку в средах Microsoft .NET и Microsoft Windows сложной и отнимающей много времени. Во-первых, отладка требует опыта - в основном вам потребуется все постигать самим. Даже если у вас специальное образование, бьюсь об заклад, что вы никогда не сталкивались со специальным курсом, посвященным отладке. В отличие от таких эзотерических предметов, как методы автоматической верификации программ на языках программирования, которые ни один дурак не использует, или разработка отладчиков для дико прогрессивных и жутко распараллеленных компьютеров, наука отладки, применяемая в коммерческом ПО, похоже, совсем не популярна в вузовском истэблишменте. Некоторые профессора наставляют: главное - не писать программы с ошибками. Хоть это и выдающаяся мысль и идеал, к которому все мы стремимся, в действительности все слегка по-другому. Изучение систематизированных проверенных методик отладки не спасет от очередной ошибки, но следование рекомендациям этой книги поможет вам сократить число ошибок, вносимых в код, а те из них, которые все-таки туда прокрались, найти быстрее.

Вторая проблема в том, что, несмотря на обилие прекрасных книг по отдельным технологиям .NET и Windows, ни в одной из них отладка не описана подробно. Для отладки в рамках любой технологии нужно знать гораздо больше, чем отдельные аспекты технологии, описываемой в той или другой книге. Одно дело знать, как встроить элемент управления ASP.NET на страницу, совсем другое - как полностью отладить элемент управления ASP.NET. Для его отладки нужно знать все тонкости .NET и ASP.NET, знать, как различные DLL помещаются в кэш ASP.NET и как ASP.NET находит элементы управления. Многие книги объясняют реализацию таких сложных функций, как соединение с удаленной базой данных с применением современнейших технологий, но когда в вашей программе не работает "db.Connect ("Foo")" - а рано или поздно это обязательно случается! - приходится самому разбираться во всей технологической цепочке. Кроме того, хотя есть несколько книг по управлению проектами, в которых обсуждаются вопросы отладки, в них делается упор на управленческие и административные проблемы, а не на задачи разработчиков. Эти книги могут включать прекрасную информацию о планировании отладки, но от этого мало толку, когда вы сталкиваетесь с разрушением базы данных или сбоем при возврате из функции обратного вызова.

Идея этой книги - плод моих проб и ошибок как разработчика и менеджера, старающегося вовремя поставить высококачественный продукт, и как консультанта, пытающегося помочь другим завершить свои разработки в срок. Год за годом я накапливал знания и подходы, применяемые для решения двух описанных проблем, чтобы облегчить разработку Windows-приложений. Для решения первой проблемы (отсутствия формального обучения по вопросам отладки) я написал первую часть этой книги - четкий курс отладки с уклоном в коммерческую разработку. Что касается второй проблемы (потребности в книге по отладке именно в .NET, а также в традиционной Windows-среде), я считаю, что написал книгу, заполняющую пробел между специфическими технологиями и будничными, но жизненно необходимыми практическими методами отладки.

Я считаю, мне просто повезло заниматься почти исключительно вопросами отладки последние восемь лет. Сориентировать свою карьеру на отладку мне помогли несколько событий. Первое: я был одним из первых инженеров, работавших в компании NuMega Technologies (ныне часть Compuware) над такими крутыми проектами, как BoundsChecker, TrueTime, TrueCoverage и SoftlCE. Тогда же я начал вести рубрику "Bugslayer" в "MSDN Magazine", а затем взялся и за первое издание этой книги. Благодаря фантастической переписке по электронной почте и общению с инженерами, разрабатывающими все мыслимые типы приложений, я получил огромный опыт.

И, наконец, самое важное, что сформировало мое мировоззрение, - участие в создании и работе Wintellect, что позволило мне пойти далеко вперед и помогать в решении весьма серьезных проблем компаниям по всему миру. Представьте, что вы сидите на работе, на часах - полдень, в голове - никаких идей, а клиент может обанкротиться, если вы не найдете ошибку. Сценарий устрашающий, но адреналина хоть отбавляй. Работа с лучшими инженерами в таких компаниях, как Microsoft, eBay, Intuit и многими другими - лучший из известных мне способов узнать все методы и хитрости для устранения ошибок.

ДЛЯ КОГО ЭТА КНИГА?

Я написал эту книгу для разработчиков, которые не хотят допоздна сидеть на работе, отлаживая программы, и хотят улучшить качество своего кода и организации. Я также написал эту книгу для менеджеров и руководителей коллективов, которые хотели бы иметь более эффективные команды разработчиков.

С технической точки зрения, "идеальный читатель" - это некто, имеющий опыт разработки для .NET или Windows от одного до трех лет. Я также рассчитываю, что читатель является членом реальной команды и уже поставил хотя бы один продукт. Хоть я и не сторонник навешивать ярлыки, в программной отрасли разработчики с таким уровнем опыта называются "средними".

Для опытных разработчиков тоже будет польза. Многие из наиболее заинтересованных корреспондентов в переписке по первому изданию этой книги были опытные разработчики, которым, казалось бы, и учиться уже нечему. Я был заинтригован тем, что эта книга помогла им добавить новые инструменты в свой арсенал. Так же, как и в первом издании, группа замечательных друзей под названием "Команда Рецензентов" просматривала и критиковала все главы, прежде чем я отправлял их в Microsoft Press. Эти инженеры, перечисленные в разделе "Благодарности" этой книги, - сливки общества разработчиков, благодаря им каждый читатель этой книги узнает что-нибудь полезное.

КАК ЧИТАТЬ ЭТУ КНИГУ И ЧТО НОВОГО ВО ВТОРОМ ИЗДАНИИ

Первое издание было ориентировано на отладку, связанную с Microsoft Visual Studio 6 и Microsoft Win32. Поскольку появилась совершенно новая среда разработки, Microsoft Visual Studio .NET 2003, и совершенно новая парадигма программирования, .NET, есть еще о чем рассказать. На самом деле в первом издании было 512 страниц, а в этой - около 850, так что новой информации хватает. Несколько моих рецензентов сказали: "Непонятно, почему ты называешь это вторым изданием, это же совершенно новая книга!" Чтобы вы правильно понимали, насколько второе издание больше первого, замечу, что в первом издании 2,5 Мб исходных текстов, а в этом - 6,9! Не забывайте: это только исходные тексты и вспомогательные файлы, а не скомпилированные двоичные файлы (скомпилировав все, вы получите более 1 Гб). Что еще интересней, я даже не включил две главы из первого издания во второе. Как видите, это совершенно новая книга.

Я разделил книгу на четыре части. Первые две (главы с 1 по 8) следует читать по порядку, поскольку материал в них изложен в логической последовательности.

В части I "Сущность отладки" (главы с 1 по 3) я даю определение видов ошибок и описываю процесс отладки, которому следуют все порядочные разработчики. По просьбе читателей первого издания я расширил и углубил обсуждение этих тем. Я также рассматриваю инфраструктурные требования, необходимые для правильной коллективной отладки. Настоятельно рекомендую уделить особое внимание вопросу установки сервера символов в главе 2. Наконец, поскольку вы можете (и должны) уделять огромное внимание отладке на этапе кодирования, я рассказываю про упреждающую отладку при написании кода. Заключительное слово в обсуждении темы первой части - в главе 3, в которой говорится об утверждениях в .NET и Win32.

Часть II "Производительная отладка" (главы с 4 по 8) я начинаю объяснением поддержки отладки со стороны ОС и рассказываю о работе отладчика Win32, так как Win32-oтлaдкa имеет больше потаенных мест, чем .NET Чем лучше вы разберетесь с инструментарием, тем лучше сможете его применять. Я также достаточно глубоко разбираю отладчик Visual Studio .NET, так что вы научитесь выжимать из него по максимуму как в .NET, так и в Win32. Одна вещь, которую я узнал, работая с программистами как опытными, так и очень опытными, - они используют лишь крошечную часть возможностей отладчика Visual Studio .NET Хотя такие сантименты могут казаться странными в устах автора книги об отладке, я хочу, насколько это возможно, оградить вас от применения отладчика. Читая книгу, вы увидите, что моя цель в первую очередь - научить вас избегать ошибок, а не находить их. Я также хочу научить вас использовать максимум возможностей отладчика, поскольку все-таки настанут времена, когда вы будете его применять.

В части III "Мощные средства и методы отладки приложений .NET" (главы с 9 по 11) я предлагаю несколько утилит для .NET-разработки. В главе 9 описаны потрясающие возможности расширения Visual Studio .NET Я представляю несколько отличных макросов и надстроек, которые помогут ускорить разработку независимо от того, с чем вы работаете: с .NET или только с Win32. В главах 10 и 11 рассказывается об отличном интерфейсе .NET Profiling API и представляются два инструмента, которые помогут вам отслеживать исключения и ход выполнения ваших .NET-приложений.

В заключительной части "Мощные средства и методы отладки неуправляемого кода" (главы с 12 по 19) предлагаются решения распространенных проблем отладки, с которыми вы столкнетесь при написании Windows-приложений. Я раскрываю темы от поиска исходного файла и номера строки для сбойного адреса, до корректной обработки сбоев приложений. Главы с 15 по 18 были и в первом издании, однако я существенно изменил их текст, а некоторые утилиты (Deadlock-Detection, Tester и MemDumperValidator) полностью переписал. Кроме того, такие утилиты, как Tester, прекрасно работают как с неуправляемым кодом, так и с .NET И, наконец, я добавил два новых отладочных инструмента для Windows: FastTrace (глава 18) и Smooth Working Set (глава 19).

Приложения (А и Б) содержат дополнительную информацию, которую вы найдете полезной в своих отладочных приключениях. В приложении А я объясняю, как читать и интерпретировать журнал программы Dr. Watson. В приложении Б вы обнаружите аннотированный список ресурсов (книг, инструментов, Web-сайтов), которые помогли мне отточить свое мастерство как разработчика/отладчика.

В первом издании я предложил несколько врезок с фронтовыми очерками об отладке. Реакция была ошеломляющей, и в этом издании я существенно увеличил их число. Надеюсь, поделившись с вами примерами некоторых действительно "хороших" ошибок, я помог обнаружить (или внести!) аналогичные, и вы увидели практическое применение рекомендуемых мной подходов и методик. Мне также хотелось бы помочь вам избежать ошибок, сделанных мной.

У меня был список вопросов, которые мне задали в связи с первым изданием, и на них я ответил во врезках "Стандартный вопрос отладки".

Комментарии

Алексей Кирюшкин

Второе издание отличной книги. Причем расширенное и исправленное по отзывам читателей в части отладки неуправляемого кода и дополненное сведениями об отладке приложений .NET. Расширена книга значительно - 736 страниц против 490 в первом издании.

Особо хочется отметить сугубо практический подход автора к излагаемому материалу - если речь идет о пользе отладочных символов ОС, то тут же следует подробная инструкция по достижению символьной нирваны - созданию собственного сервера отладочных символов для вашей команды, рассматривается применение ASSERT-ов - автор проводит читателя по этапам реализации SUPERASSERT-а, выводящего в окне сообщения максимум информации, включая стек вызовов:

Даже рассмотрение вопросов блокировок в многопоточных приложениях заканчивается созданием утилиты DeadlockDetection для обнаружения мест блокировок и вывода максимальной информации для разработчика.

Максимум всесторонней информации по отладке приложений и отличная коллекция отладочных библиотек и утилит, разработанных автором (вместе с их исходными кодами!) делают книгу незаменимой для любого разработчика приложений под Windows.