Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Роббинс Д. - Отладка приложений для Microsoft .NET и Microsoft Windows - 2004

.pdf
Скачиваний:
320
Добавлен:
13.08.2013
Размер:
3.3 Mб
Скачать

Бурные аплодисменты рецензентов

Если вы стали Bugslayer’ом с первой книгой Джона Роббинса, со второй его книгой вы ста нете управляемым и неуправляемым BugslayerEx’ом.

Кристоф Назаррэ, менеджер разработок Business Objects

Хотя .NET оберегает от многих ошибок, которые мы бы допустили в Win32, отлаживать их все равно приходится. Из книги Джона я узнал много нового о .NET и отладке. Попав в ту пик, я прежде всего звоню Джону.

Джеффри Рихтер, соучредитель Wintellect

Это фантастическая книга для Windows и .NET разработчиков. Роббинс дает несметное чис ло советов и средств, чтобы сделать процесс более эффективным, не говоря о том, что и бо лее приятным. Он рассматривает отладку с разных сторон: написание кода, который легче отлаживать, инструменты и их скрытые возможности, что происходит внутри отладчика и как расширять Visual Studio.

Брайан Мориарти, специалист по персоналу и чемпион по коду QuickBooks, Intuit

Один из признаков выдающегося разработчика — способность признать, что всегда есть, чему учиться. Новичок вы или гуру, книга Джона все равно чему нибудь да научит.

Барри Танненбаум, руководитель разработки BoundsChecker, Compuware NuMega Lab

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

Джо Эббот, ведущий проектировщик Microsoft

На этих страницах Джон собрал действительно замечательную коллекцию сведений об отладке. В то время как в других книгах обсуждение отладки ограничивается советами о том, как избе жать ошибок и обзором некоторых методик их отслеживания, в книге Джона описываются по лезные инструменты и API, которые толком нигде не описаны. Прибавьте к этому массу ценных примеров, и перед вами не книга, а золотая жила для программистов .NET и Win32.

Келли Брок, Electronic Arts

Второе издание книги Джона Роббинса приятно удивило всех его поклонников. Если вы не хотите потратить годы на изучение .NET или Win32, эта книга для вас. Впечатляет, что даже самые сложные темы Джон Роббинс излагает просто и доступно. Мне кажется, что эта книга должна стать эталоном книг для разработчиков. Я программирую для Windows уже 19 лет, и, если мне придется оставить на полке единственную книгу, я оставлю эту.

Озирис Педрозо, Optimizer Consulting

Visual Studio .NET — прекрасное средство разработки, и когда я с ним столкнулся, то решил, что имею все, что нужно. Но Джон Роббинс снова представил книгу, в которой объясняются вещи, о которых я и не знал, что мне их нужно знать! Еще раз спасибо, Джон, за великолеп ный ресурс для .NET разработчиков!

Питер Иерарди, Software Evolutions

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

Спенсер Лау, разработчик, подразделение SQL Server Microsoft

Если вы хоть раз сорвали сроки проекта из за ошибок — читайте книгу Джона! Джон не толь ко научит, как искать эти мерзкие ошибки, но и расскажет об инструментах и подходах, ко торые прежде всего помогут избежать ошибок.

Джеймс Нэфтел, менеджер продукта, XcelleNet

John Robbins

Debugging applicatons

for Microsoft®

.NET

and Microsoft®

WINDOWS

Джон Роббинс

Отладка приложений

для Microsoft®

.NET

и Microsoft®

WINDOWS

Москва, 2004

УДК 004.45 ББК 32.973.26 018.2

Р58

Роббинс Джон

Р58 Отладка приложений для Microsoft .NET и Microsoft Windows /Пер. с англ. — М.: Издательство «Русская Редакция», 2004. — 736 стр.: ил.

ISBN 978–5–7502–0243—0

В книге описаны тонкости отладки всех видов приложений .NET и Win32: от Web сервисов XML до служб Windows. Каждая глава снабжена примерами, кото рые позволят увеличить продуктивность отладки управляемого и неуправляемо го кода. На прилагаемом компакт диске содержится более 6 Мб исходных кодов примеров и полезных отладочных утилит.

Книга состоит из 19 глав, 2 приложений и предметного указателя. Издание снабжено компакт диском, содержащим исходные тексты примеров, утилиты и инструментальные отладочные средства.

УДК 004.45 ББК 32.973.26 018.2

Подготовлено к изданию по лицензионному договору с Microsoft Corporation, Редмонд, Вашинг тон, США.

Macintosh — охраняемый товарный знак компании Apple Computer Inc. ActiveX, BackOffice, JScript, Microsoft, Microsoft Press, MSDN, NetShow, Outlook, PowerPoint, Visual Basic, Visual C++, Visual InterDev, Visual J++, Visual SourceSafe, Visual Studio, Win32, Windows и Windows NT являются товар ными знаками или охраняемыми товарными знаками корпорации Microsoft в США и/или других странах. Все другие товарные знаки являются собственностью соответствующих фирм.

Все названия компаний, организаций и продуктов, а также имена лиц, используемые в приме рах, вымышлены и не имеют никакого отношения к реальным компаниям, организациям, про дуктам и лицам.

 

© Оригинальное издание на английском языке,

 

John Robbins, 2003

 

© Перевод на русский язык, Microsoft Corporation,

 

2004

ISBN 0 7356 1536 5 (англ.)

© Оформление и подготовка к изданию, издатель

ISBN 978 5 7502 0243 0

ство «Русская Редакция», 2004

Оглавление

Благодарности

XIII

Введение

XIV

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

Ч А С Т Ь

I

 

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

1

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

 

и как с ними бороться?

2

Ошибки и отладка . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . 2

Что такое программные ошибки? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 3

Обработка ошибок и решения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 6

Планирование отладки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

Необходимые условия отладки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

Необходимые навыки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

Выработка мастерства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

Процесс отладки . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

Шаг 1. Воспроизведи ошибку . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19

Шаг 2. Опиши ошибку . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

Шаг 3. Всегда предполагай, что ошибка твоя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

Шаг 4. Разделяй и властвуй . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

Шаг 5. Мысли творчески . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

Шаг 6. Усиль инструментарий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

Шаг 7. Начни интенсивную отладку . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

Шаг 8. Проверь, что ошибка устранена . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

Шаг 9. Научись и поделись . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

Последний секрет отладки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

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

26

Следите за изменениями проекта вплоть до его окончания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Системы управления версиями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Системы отслеживания ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Выбор правильных систем . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Планирование времени построения систем отладки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Создавайте все компоновки с использованием символов отладки . . . . . . . . . . . . . . 34

При работе над управляемым кодом рассматривайте предупреждения как ошибки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 При работе над неуправляемым кодом рассматривайте предупреждения

как ошибки (в большинстве случаев) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Разрабатывая неуправляемый код, знайте адреса загрузки DLL . . . . . . . . . . . . . . . . . . 44 Как поступать с базовыми адресами управляемых модулей? . . . . . . . . . . . . . . . . . . . . . 48 Разработайте несложную диагностическую систему для заключительных компоновок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

V I Оглавление

Частые сборки программы и дымовые тесты обязательны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Частые сборки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Дымовые тесты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Работу над программой установки следует начинать немедленно . . . . . . . . . . . . . . . . . . . . . . 60 Тестирование качества должно проводиться с отладочными компоновками . . . . . . . . . 61 Устанавливайте символы ОС и создайте хранилище символов . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Исходные тексты и серверы символов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

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

72

Assert, Assert, Assert и еще раз Assert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . 74

Как и что утверждать . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . 75

Утверждения в .NET Windows Forms или консольных приложениях . . . . . . . . . .

. . 83

Утверждения в приложениях ASP.NET и Web=сервисах XML . . . . . . . . . . . . . . . . . . . .

. . 92

Утверждения в приложениях C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 102

Различные типы утверждений в Visual C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 106

assert, _ASSERT и _ASSERTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 106

ASSERT_KINDOF и ASSERT_VALID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 108

Главное в реализации SUPERASSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 115

Trace, Trace, Trace и еще раз Trace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 130

Трассировка в Windows Forms и консольных приложениях .NET . . . . . . . . . . . . .

. 131

Трассировка в приложениях ASP.NET и Web=сервисах XML . . . . . . . . . . . . . . . . . . . .

. 133

Трассировка в приложениях C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 135

Комментировать, комментировать и еще раз комментировать . . . . . . . . . . . . . . . . . . . . . . . .

. 135

Доверяй, но проверяй (Блочное тестирование) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 137

Ч А С Т Ь

I I

 

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

141

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

142

Типы отладчиков Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 143

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

. 143

Отладчики режима ядра . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 146

Поддержка отлаживаемых программ операционными системами Windows . . . . . . . .

. 148

Отладка Just=In=Time (JIT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 148

Автоматический запуск отладчика (опции исполнения загружаемого

 

модуля) . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 152

MiniDBG — простой отладчик Win32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 154

WDBG — настоящий отладчик . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 173

Чтение памяти и запись в нее . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 175

Точки прерывания и одиночные шаги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 178

Таблицы символов, серверы символов и анализ стека . . . . . . . . . . . . . . . . . . . . . . . . . .

. 183

Шаг внутрь, Шаг через и Шаг наружу . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 191

Итак, вы хотите написать свой собственный отладчик . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 192

Что после WDBG? . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 193

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

 

Visual Studio .NET

 

195

Расширенные точки прерывания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 196

Подсказки к точкам прерывания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 197

Быстрое прерывание на функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 199

Модификаторы точек прерывания по месту . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 205

Несколько точек прерывания на одной строке . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 208

Окно Watch . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 209

Вызов методов в окне Watch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 210

Команда Set Next Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 212

Оглавление

VII

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

 

в среде Visual Studio .NET

215

Усложненные точки прерывания для программ .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 216

Условные выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 216

Окно Watch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 220

Автоматическое развертывание собственных типов . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 221

Советы и хитрости . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 224

DebuggerStepThroughAttribute и DebuggerHiddenAttribute . . . . . . . . . . . . . . . . . . . .

. . . 224

Отладка в смешанном режиме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 225

Удаленная отладка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 226

ILDASM и промежуточный язык Microsoft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 228

Начинаем работу с ILDASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 229

Основы CLR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 234

MSIL, локальные переменные и параметры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 235

Важные команды . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 237

Другие инструменты восстановления алгоритма . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 242

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

 

в Visual Studio .NET

245

Усложненные точки прерывания для неуправляемого кода . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 245

Усложненный синтаксис точек прерывания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 246

Точки прерывания в системных и экспортируемых функциях . . . . . . . . . . . . . .

. . . 247

Условные выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 250

Точки прерывания по данным . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 252

Окно Watch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 255

Форматирование данных и вычисление выражений . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 255

Хронометраж кода в окне Watch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 257

Недокументированные псевдорегистры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 258

Автоматическое разворачивание собственных типов . . . . . . . . . . . . . . . . . . . . . . . .

. . . 258

Удаленная отладка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 265

Советы и уловки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 268

Отладка внедренного кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 268

Окно Memory и автоматическое обновление . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 269

Контроль исключений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 269

Дополнительные советы по обработке символов . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 272

Отключение от процессов Windows 2000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 272

Обработка дамп=файлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 272

Язык ассемблера x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 274

Основы архитектуры процессоров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 275

Кое=какие сведения о встроенном ассемблере Visual C++ .NET . . . . . . . . . . . . . .

. . . 281

Команды, которые нужно знать . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 282

Частая последовательность команд: вход в функцию и выход из функции

. . . 285

Вызов процедур и возврат из них . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 287

Соглашения вызова . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 288

Доступ к переменным: глобальные переменные, параметры и локальные

 

переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 294

Дополнительные команды, которые нужно знать . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 299

Манипуляции со строками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 304

Распространенные ассемблерные конструкции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 308

Ссылки на структуры и классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 309

Полный пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 311

Окно Disassembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 313

Исследование стека «вручную» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 317

Советы и хитрости . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . 320

VIII

Оглавление

 

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

 

с использованием WinDBG

323

Прежде чем начать . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 324

Основы . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 326

Что случается при отладке . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 330

 

Получение помощи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 330

 

Обеспечение корректной загрузки символов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 331

 

Процессы и потоки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 335

Общие вопросы отладки в окне Command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 340

 

Просмотр и вычисление переменных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 340

 

Исполнение, проход по шагам и трассировка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 341

 

Точки прерывания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 347

 

Исключения и события . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 350

 

Управление WinDBG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 352

Магические расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 353

 

Загрузка расширений и управление ими . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 353

 

Важные команды расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 354

Работа с файлами дампа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 359

 

Создание файлов дампа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 359

 

Открытие файлов дампа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 360

 

Отладка дампа

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 361

Son of Strike (SOS) . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 362

 

Использование SOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 363

Ч А С Т Ь

I I I

 

МОЩНЫЕ СРЕДСТВА И МЕТОДЫ ОТЛАДКИ

 

ПРИЛОЖЕНИЙ .NET

371

Глава 9 Расширение возможностей интегрированной

 

среды разработки Visual Studio .NET

372

Расширение IDE при помощи макросов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 374

 

Параметры макросов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 375

 

Проблемы с проектами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 376

 

Элементы кода

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 377

CommenTater: лекарство от распространенных проблем? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 379

Введение в надстройки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 387

 

Исправление кода, сгенерированного мастером Add=In Wizard . . . . . . . . . . . . . . .

. 389

 

Решение проблем с кнопками панелей инструментов . . . . . . . . . . . . . . . . . . . . . . . . . .

. 391

 

Создание окон инструментов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 393

 

Создание на управляемом коде страниц свойств окна Options . . . . . . . . . . . . . . . .

. 395

Надстройка SuperSaver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 399

Надстройка SettingsMaster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 405

 

Вопросы реализации SettingsMaster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 411

 

Будущие усовершенствования SettingsMaster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 412

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

413

Введение в Profiling API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 414

 

Запуск средства профилирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 420

ProfilerLib . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 422

ExceptionMon . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 424

 

Внутрипроцессная отладка и ExceptionMon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 425

Использование исключений в .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 430

Оглавление IX

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

433

Установка ловушек при помощи Profiling API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 Запрос уведомлений входа и выхода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434 Реализация функций=ловушек . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434 Встраивание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 Преобразователь идентификаторов функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436

Использование FlowTrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437 Некоторые сведения о реализации FlowTrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439 Что после FlowTrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441

Ч А С Т Ь I V

 

МОЩНЫЕ СРЕДСТВА И МЕТОДЫ ОТЛАДКИ

 

НЕУПРАВЛЯЕМОГО КОДА

443

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

444

Создание и чтение MAP=файла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 446

Содержание MAP=файла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 447

Получение информации об исходном файле, имени функции

 

и номере строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 450

PDB2MAP: создание MAP=файлов постфактум . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 452

Использование CrashFinder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 454

Некоторые сведения о реализации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 457

Что после CrashFinder? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. 462

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

464

Структурная обработка исключений против обработки исключений C++ . . . . . . . . . . . . 465 Структурная обработка исключений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 Обработка исключений C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 Избегайте использования обработки исключений C++ . . . . . . . . . . . . . . . . . . . . . . . . . . 470 API=функция SetUnhandledExceptionFilter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475 Использование API CrashHandler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477 Преобразование структур EXCEPTION_POINTERS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 Минидампы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 API=функция MiniDumpWriteDump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 Укрощение MiniDumpWriteDump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505

Глава 14

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

515

Основы служб . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

515

API . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

516

Защита . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

517

Отладка служб . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

518

Отладка базового кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

518

Отладка службы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

519

Глава 15

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

527

Советы и уловки, касающиеся многопоточности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 Не используйте многопоточность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 Не злоупотребляйте многопоточностью . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 Делайте многопоточными только небольшие изолированные фрагменты программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528

Выполняйте синхронизацию на как можно более низком уровне . . . . . . . . . . . . . 529 Работая с критическими секциями, используйте спин=блокировку . . . . . . . . . . . 532 Не используйте функции CreateThread/ExitThread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533

X

Оглавление

 

 

Опасайтесь диспетчера памяти по умолчанию . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

534

 

Получайте дампы в реальных условиях . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

535

 

Уделяйте особое внимание обзору кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

536

 

Тестируйте многопоточные приложения на многопроцессорных

 

 

компьютерах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

537

Требования к DeadlockDetection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

540

Общие вопросы разработки DeadlockDetection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

541

Использование DeadlockDetection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

542

Реализация DeadlockDetection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

545

 

Перехват импортируемых функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

545

 

Детали реализации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

553

Что после DeadlockDetection? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

567

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

570

Проклятие блочного тестирования: UI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

570

Требования к Tester . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

571

Использование Tester . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

572

 

Сценарии Tester . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

573

 

Запись сценариев . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

577

Реализация Tester . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

580

 

Уведомления и воспроизведение файлов в TESTER.DLL . . . . . . . . . . . . . . . . . . . . . . . . . .

580

 

Реализация TESTREC.EXE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

596

Что после Tester? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

607

Глава 17 Стандартная отладочная библиотека C

 

и управление памятью

609

Особенности стандартной отладочной библиотеки C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

610

Использование стандартной отладочной библиотеки C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

611

 

Ошибка в DCRT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

613

 

Полезные функции DCRT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

617

Выбор правильной стандартной отладочной библиотеки C для вашего

 

приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

618

Использование MemDumperValidator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

619

 

Использование MemDumperValidator в программах C++ . . . . . . . . . . . . . . . . . . . . . . . .

626

 

Использование MemDumperValidator в программах C . . . . . . . . . . . . . . . . . . . . . . . . . . .

627

 

Глубокая проверка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

628

Реализация MemDumperValidator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

632

 

Инициализация и завершение в программах C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

633

 

И куда же подевались все сообщения об утечках памяти? . . . . . . . . . . . . . . . . . . . . . . .

634

Использование MemStress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

635

 

Интересные проблемы с MemStress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

637

Кучи операционной системы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

638

Советы по отслеживанию проблем с памятью . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

640

 

Обнаружение записи в неинициализированную память . . . . . . . . . . . . . . . . . . . . . . . .

640

 

Нахождение записи данных после окончания блока . . . . . . . . . . . . . . . . . . . . . . . . . . . .

641

Потрясающие ключи компилятора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

647

 

Ключи проверки ошибок в период выполнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

647

 

Ключ проверки безопасности буфера . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

653

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

 

трассировки серверных приложений

655

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

Соседние файлы в предмете Программирование на C++