/
Text
К.Х.Паппас, У.Х.Мюррей III
ОТЛАДКА В C++
В книге рассматриваются как общие методики и стратегии написания кода и
отладки (вплоть до «проектирования, независимого от языка»), так и весьма
специальные вопросы вроде отладки элементов ActiveX. Некоторые главы книги
посвящены чрезвычайно актуальным вопросам, о которых к тому же почти нигде
не пишется. Это, например, отладка кода с шаблонами STL или работа с OLE-
ориентированными объектами --- СОМ и ActiveX. Отдельные части (II и III)
отхватывают широкий круг теоретико-практических вопросов отладки в
процедурно- и объектно-ориентированных системах. Специфические аспекты
C++ освещаются в части IV. К специальным аспектам программирования
Windows можно отнести всю часть V. Дается подробное описание отладчика
Visual C++, однако даже специально ему посвященные главы полезны и тем, кто
работает с другими компиляторами и даже другими языками; в конце концов все
интегрированные отладчики похожи друг на друга. Все изложение
сопровождается примерами законченных программ и экранными иллюстрациями.
Книгу можно порекомендовать широкому кругу программистов, но хорошее
знание C++ является обязательным.Содержание
Вступление
13
Часть 1. Искусство разработки кода
15
Глава 1. Как пишется хороший код
17
Кому нужна эта книга?
18
Структура книги
19
С чего мне начинать?
19
ВНИМАНИЕ! Не все компиляторы C/C++ одинаковы
20
Независимые от языка инструменты проектирования
20
Сцена действия
21
Моделируйте!
22
Структурные диаграммы, псевдокод и диаграммы IPO
23
Пять элементов хорошей программной разработки
26
Правила существуют, чтобы их нарушать
27
Ансель Адамс или Пикассо
27
Блоки комментариев
28
идентификаторы, ИДЕНТИФИКАТОРЫ, Идентификаторы
28
Пробелы и отступы
30
Типы данных
35
Венгерская нотация
37
Соглашения об именах для классов MFC, дескрипторов, элементов
управления и структур
38
Соглашения об именах для общих префиксов
39
Соглашения об именах переменных
39
Соглашения об именах символов
40
Соглашения об именах макросов MFC
41
Соглашения об идентификаторах библиотек
41
Соглашения об именах статических версий библиотек
41
Соглашения об именах динамических библиотек
42
Соглашения об именах в windows.h
42
Старшинство операций
42
Глава 2. Оптимизации компилятора
45
Распределение обязанностей
47
Оптимизации в Microsoft Visual C++
48
Синхронизация инструкций
48
Компоновка на уровне функций
49
Слияние строк
49
Регистровые переменные
49
Распространение констант и копий
51
Исключение мертвого кода и данных
51
Исключение избыточных подвыражений
52
Оптимизация циклов
52
Понижение ранга операций
53
Генерация inline-расширений
53
Исключение указателя кадра
54
Отключение проверки стека
54
Перекрытия стека
55
Разрешение псевдонимов, получаемых как значение функции
56
Глобальные оптимизации
57
Генерация встроенных расширений для внутренних функций
57
Оптимизация math.h
57
Ключи оптимизации Microsoft C++
57
Установка опций компилятора с помощью Microsoft Visual Studio
59
Категория General диалога Project Settings
61
Категория Code Generation диалога Project Settings
61
Категория Customize диалога Project Settings
64
Категория Optimizations диалога Project Settings
65
Некоторые рекомендации
66
Глава 3. Логические и синтаксические ошибки
69
Хорошая стратегия отладки
71
Четыре категории программных ошибок
72
Синтаксические ошибки
73
Ошибки компоновщика
73
Ошибки времени выполнения
74
Логические ошибки
76
Расшифровка сообщений об ошибках
77
Превентивное тестирование
79
Трассировка на бумаге
79
Проектирование с обработкой исключений
80
«Помогите им»
81
Справочная система Microsoft Visual C++
82
Глава 4. Основы работы с отладчиком
85
Подключение отладчика
86
Запуск отладчика
87
Разница между Step Over и Step Into
89
Go
90
Run to Cursor
90
Значки инструментальной панели отладчика
90
Restart
90
Stop Debugging
90
Break Execution
91
Apply Code Changes, Edit and Continue
91
Show Next Statement
93
Step Into
93
Step Over
93
Step Out
93
Run to Cursor
93
QuickWatch
93
Watch
93
Variables
94
Registers
94
Memory
94
Call Stack
94
Disassembly
94
Эквиваленты меню для кнопок отладчика
94
Дополнительные пункты меню Debug
95
Step Into Specific Function
95
Exceptions
95
Treads
95
Modules
95
Локальное меню отладчика
95
List Members
95
Type Info
96
Parameter Info
96
Complete Word
96
Go To Definition/Reference
97
Go To Disassembly
97
Insert/Remove Breakpoint
97
Окна отладчика
97
Окно Trace
97
Окно Watch
98
Меню View | Debug Windows
99
Workspace
99
Output
99
Наблюдение переменных как данных различного типа
99
Just-in-Time debugging
101
Страница Debug в окне Options
101
Hexadecimal display
102
Source annotation
102
Code bytes
102
Symbols
102
Parameter values
102
Parameter types
103
Return value.
103
Load COFF & Exports
103
Address
103
Format
103
Re-evaluate expression
103
Show data bytes
103
Fixed width
103
Display Unicode strings
103
View floating point registers
104
Just-in-Time debugging
104
OLE RFC debugging
104
Debug commands invoke Edit and Continue
104
Раскладка клавиатуры
104
Короткие клавиши отладчика
105
Глава 5. Исполняемый модуль: отладочная и окончательная версии 107
Установки по умолчанию для отладочной и окончательной версий
108
Изменение установок проекта для отладочной постройки
109
Изменение опций отладки
109
Изменение формата генерируемой отладочной информации
109
Генерация карты символов
110
Переадресация ввода и вывода
110
Что такое файл .pdb?
111
Что такое файл .dbg?
112
Отладка оптимизированного кода
112
Другой способ активации отладчика
114
Вызов базовой или отладочной версии
115
Отладочные исполнительные библиотеки C/C++
116
Смешение старого iostream.h и нового iostream
117
Справка по компоновщику
118
Поиск ошибок рабочей версии в отладочной
120
Автоматическая инициализация локальных переменных
120
Проверка стека вызовов указателей.
121
Проверка стека вызовов
122
Макрос TRACE
122
Макрос VERIFY
122
Перенос старых версий Visual C++
123
Преобразование старых 32-битных рабочих пространств и проектов 123
Сосуществование с предыдущими версиями
124
Часть II. Процедурно-ориентированная среда
125
Глава 6. Поиск, анализ и исправление ошибок в коде командной
строки
127
Научите меня отлаживать, только поскорее
128
Быстрые способы запуска отладчика
129
Трассировка инициализации переменных
133
Отлаживайте свой код, а не C++ Страуструпа!
138
Давайте заглянем в эту переменную!
141
Остановка отладчика
141
Доставка в конкретную строчку кода
141
Исполнение программы до контрольной точки
142
Прогон до курсора.
144
Окончательный тест
144
Нечто более сложное
145
Продолжение с новыми значениями
145
Приемы отладки циклов
150
Отладка вызовов функций
154
Рекурсивные вызовы и стек вызовов
159
Просмотр кода Дизассемблера
162
Более пристальный взгляд на переменные
165
Работа с окном QuickWatch
165
Работа с окном Watch
167
Глава 7. Отладка встроенного кода на языке ассемблера
169
Краткий обзор основ языка ассемблера
170
Типы данных
170
Регистры
171
Режимы адресации
171
Указатели
172
Сопроцессор
173
Отладка
174
Вычитание чисел
175
Работа с 256-битными целыми
178
Программирование циклов
188
Сложение вещественных чисел на сопроцессоре
194
Вычисление значений тангенса на сопроцессоре
198
Проблемный код
198
Глава 8. Поиск, анализ и исправление ошибок в коде Windows
209
Отладка на двух машинах
210
Подготовка удаленной целевой машины
211
Подготовка главной машины
212
Инициирование сеанса отладки
213
Краткое введение в Windows
215
Базовый код Windows
215
Специальные отладочные файлы
217
Что происходит в этой программе?
217
Отладка
224
Программа анимации битовой матрицы
224
Рисование мышью
238
Часть III. Объектно-ориентированная среда
253
Глава 9. Поиск, анализ и исправление ошибок в коде командной
строки
255
Специальные инструменты отладки
256
Распечатка памяти
256
Локализация передачи некорректного параметра
259
Локализация точки модификации указателя
261
Элементы Class View
271
Группировка по доступу
273
Базовые классы в ClassView
275
Ссылки в ClassView
277
Производные классы в ClassView
277
Дополнительные локальные меню ClassView
278
Свойства элементов в ClassView
279
Добавление папок в ClassView
281
Перемещение классов из папки в папку
281
Свертывание и отображение ClassView
281
Отладка argc и argv[]
281
Глава 10. Программирование Windows с библиотекой Microsoft
Foundation Class
287
Зачем нужна библиотека классов?
288
Истинно основной класс --- CObject
289
Что такое Application Wizard и Class Wizard?
291
Приложение Graph
292
Работа с Арр Wizard
292
Работа с ClassWizard
298
Компиляция кода Арр Wizard
300
Каркасный код Арр Wizard
300
Графика в области клиента
308
Профилирование
312
Глава 11. Поиск, анализ и исправление ошибок в коде MFC
319
Проблемы с памятью
320
Проблемный код
321
Локализация и анализ
324
Параметры диагностики памяти
329
Локализация утечки памяти
330
Распечатка статистики памяти
331
Исправление проекта
332
Проблемы при построении графиков
336
Проблемный код
336
Локализация и анализ
341
Исправленный проект
348
Часть IV. Библиотека стандартных шаблонов
353
Глава 12. Код C++, шаблоны и STL
355
Разнообразие архитектур
356
Приручение C++
356
STL --- ящик со структурами?
358
STL --- первый взгляд
358
STL и Хьюлетт-Паккард
359
STL --- в массы
359
STL --- общий вид
360
STL и ANSI/ISO C++
360
Фундаментальные компоненты STL
361
Что такое контейнер?
361
Что такое адаптер?
363
Что такое алгоритм?
363
Что такое итератор?
364
Имеются ли другие компоненты STL?
364
Полный пакет STL
365
Классический С, ANSI С, C++, ANSI C++
366
Структуры данных --- обзор
367
Статическое и динамическое
367
Типизированные указатели
368
«Пустые» указатели
368
Еще раз о венгерской нотации
371
Перегрузка функций
373
Указатели на функцию
373
Перегрузка операций
376
Перегруженные операции и вызовы функций
377
Написание перегруженных операций
377
От структур к шаблонам
379
Ключевое слово template
380
Синтаксис шаблонов
380
Шаблоны функций
381
Шаблоны классов
381
Почему STL лучше шаблонов
382
Глава 13. Поиск, анализ и исправление ошибок в коде STL
385
Проблемы перехода от стандартного C++ к синтаксису STL
386
Обход контейнеров
386
Более близкий взгляд на итераторы
387
Итераторы потоков
388
Зачем нужен end( )!
388
Копирование списков
389
Списки внутри списков
389
Неприятности с указателями на строку
390
Освобождение указателей STL
391
Реальный пример перехода от C++ к коду STL
392
Шаг 1 --- обновление класса aSingleCard
395
Шаг 2 --- обновление класса WarDeck
398
Шаг 3 --- коррекция ошибок STL при выполнении
401
Шаг 4 --- обновление класса Opponent
403
Шаг 5 --- работающая программа STL
404
STL-версия wargame.cpp
405
Часть V. Специальные задачи отладки
411
Глава 14. Работа с DLL
413
Создание динамически присоединяемой библиотеки на основе MFC
414
Заголовочный файл Framer.h
417
Файл исходного кода Framer.cpp
418
Построение Framer.dll
420
Создание главного приложения для тестирования DLL
421
Заголовочный файл DLLDemoView.h
422
Файл исходного кода DLLDemoView.cpp
423
Обычные DLL, динамически компонуемые с библиотекой MFC
425
Обычные DLL, статически компонуемые с библиотекой MFC
427
Безопасные методики отладки DLL
428
Отладка DLL
429
Удаленная отладка
429
Проблемный код.
432
Исправленный код
435
Трудности при отладке DLL
436
Глава 15. Работа с компонентами ActiveX
439
Разработка компонента ActiveX
440
Элементы управления
441
Работа с ControlWizard
442
Тестовый контейнер
445
Создание действительного компонента Clock
447
Отладка компонента Clock
456
Подготовка удаленной целевой машины
456
Подготовка главной машины
457
Запуск сеанса отладки
458
Локализация проблемы
459
Глава 16. Отладка COM, ATL и DHTML
465
Модель объекта СОМ
466
Создание проекта ATL Polygon
466
Доработка кода шаблона
470
Тестирование компонента
483
Точки соединения и генератор ATL-посредников.
483
Отладка компонента ATL
484
Глава 17. Программирование с STL и MFC
489
Создание приложения STL / MFC
490
Синтаксис шаблона
491
Базовый код приложения
496
Отладка
501
Безопасные методики кодирования и отладки STL
505