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