Отладка в C++. Руководство для разработчиков Part 001

Page 1

К.Х.Паппас, У.Х.Мюррей 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


Соглашения об идентификаторах библиотек Соглашения об именах статических версий библиотек Соглашения об именах динамических библиотек Соглашения об именах в windows.h Старшинство операций Глава 2. Оптимизации компилятора Распределение обязанностей Оптимизации в Microsoft Visual C++ Синхронизация инструкций Компоновка на уровне функций Слияние строк Регистровые переменные Распространение констант и копий Исключение мертвого кода и данных Исключение избыточных подвыражений Оптимизация циклов Понижение ранга операций Генерация inline-расширений Исключение указателя кадра Отключение проверки стека Перекрытия стека Разрешение псевдонимов, получаемых как значение функции Глобальные оптимизации Генерация встроенных расширений для внутренних функций Оптимизация math.h Ключи оптимизации Microsoft C++ Установка опций компилятора с помощью Microsoft Visual Studio Категория General диалога Project Settings Категория Code Generation диалога Project Settings Категория Customize диалога Project Settings Категория Optimizations диалога Project Settings Некоторые рекомендации Глава 3. Логические и синтаксические ошибки Хорошая стратегия отладки Четыре категории программных ошибок Синтаксические ошибки Ошибки компоновщика Ошибки времени выполнения Логические ошибки Расшифровка сообщений об ошибках Превентивное тестирование Трассировка на бумаге Проектирование с обработкой исключений «Помогите им»

41 41 42 42 42 45 47 48 48 49 49 49 51 51 52 52 53 53 54 54 55 56 57 57 57 57 59 61 61 64 65 66 69 71 72 73 73 74 76 77 79 79 80 81


Справочная система Microsoft Visual C++ Глава 4. Основы работы с отладчиком Подключение отладчика Запуск отладчика Разница между Step Over и Step Into Go Run to Cursor Значки инструментальной панели отладчика Restart Stop Debugging Break Execution Apply Code Changes, Edit and Continue Show Next Statement Step Into Step Over Step Out Run to Cursor QuickWatch Watch Variables Registers Memory Call Stack Disassembly Эквиваленты меню для кнопок отладчика Дополнительные пункты меню Debug Step Into Specific Function Exceptions Treads Modules Локальное меню отладчика List Members Type Info Parameter Info Complete Word Go To Definition/Reference Go To Disassembly Insert/Remove Breakpoint Окна отладчика Окно Trace Окно Watch Меню View | Debug Windows Workspace Output

82 85 86 87 89 90 90 90 90 90 91 91 93 93 93 93 93 93 93 94 94 94 94 94 94 95 95 95 95 95 95 95 96 96 96 97 97 97 97 97 98 99 99 99


Наблюдение переменных как данных различного типа Just-in-Time debugging Страница Debug в окне Options Hexadecimal display Source annotation Code bytes Symbols Parameter values Parameter types Return value. Load COFF & Exports Address Format Re-evaluate expression Show data bytes Fixed width Display Unicode strings View floating point registers Just-in-Time debugging OLE RFC debugging Debug commands invoke Edit and Continue Раскладка клавиатуры Короткие клавиши отладчика Глава 5. Исполняемый модуль: отладочная и окончательная версии Установки по умолчанию для отладочной и окончательной версий Изменение установок проекта для отладочной постройки Изменение опций отладки Изменение формата генерируемой отладочной информации Генерация карты символов Переадресация ввода и вывода Что такое файл .pdb? Что такое файл .dbg? Отладка оптимизированного кода Другой способ активации отладчика Вызов базовой или отладочной версии Отладочные исполнительные библиотеки C/C++ Смешение старого iostream.h и нового iostream Справка по компоновщику Поиск ошибок рабочей версии в отладочной Автоматическая инициализация локальных переменных Проверка стека вызовов указателей. Проверка стека вызовов Макрос TRACE Макрос VERIFY

99 101 101 102 102 102 102 102 103 103 103 103 103 103 103 103 103 104 104 104 104 104 105 107 108 109 109 109 110 110 111 112 112 114 115 116 117 118 120 120 121 122 122 122


Перенос старых версий Visual C++ Преобразование старых 32-битных рабочих пространств и проектов Сосуществование с предыдущими версиями Часть II. Процедурно-ориентированная среда Глава 6. Поиск, анализ и исправление ошибок в коде командной строки Научите меня отлаживать, только поскорее Быстрые способы запуска отладчика Трассировка инициализации переменных Отлаживайте свой код, а не C++ Страуструпа! Давайте заглянем в эту переменную! Остановка отладчика Доставка в конкретную строчку кода Исполнение программы до контрольной точки Прогон до курсора. Окончательный тест Нечто более сложное Продолжение с новыми значениями Приемы отладки циклов Отладка вызовов функций Рекурсивные вызовы и стек вызовов Просмотр кода Дизассемблера Более пристальный взгляд на переменные Работа с окном QuickWatch Работа с окном Watch Глава 7. Отладка встроенного кода на языке ассемблера Краткий обзор основ языка ассемблера Типы данных Регистры Режимы адресации Указатели Сопроцессор Отладка Вычитание чисел Работа с 256-битными целыми Программирование циклов Сложение вещественных чисел на сопроцессоре Вычисление значений тангенса на сопроцессоре Проблемный код Глава 8. Поиск, анализ и исправление ошибок в коде Windows Отладка на двух машинах Подготовка удаленной целевой машины Подготовка главной машины Инициирование сеанса отладки

123 123 124 125 127 128 129 133 138 141 141 141 142 144 144 145 145 150 154 159 162 165 165 167 169 170 170 171 171 172 173 174 175 178 188 194 198 198 209 210 211 212 213


Краткое введение в Windows Базовый код Windows Специальные отладочные файлы Что происходит в этой программе? Отладка Программа анимации битовой матрицы Рисование мышью Часть III. Объектно-ориентированная среда Глава 9. Поиск, анализ и исправление ошибок в коде командной строки Специальные инструменты отладки Распечатка памяти Локализация передачи некорректного параметра Локализация точки модификации указателя Элементы Class View Группировка по доступу Базовые классы в ClassView Ссылки в ClassView Производные классы в ClassView Дополнительные локальные меню ClassView Свойства элементов в ClassView Добавление папок в ClassView Перемещение классов из папки в папку Свертывание и отображение ClassView Отладка argc и argv[] Глава 10. Программирование Windows с библиотекой Microsoft Foundation Class Зачем нужна библиотека классов? Истинно основной класс — CObject Что такое Application Wizard и Class Wizard? Приложение Graph Работа с Арр Wizard Работа с ClassWizard Компиляция кода Арр Wizard Каркасный код Арр Wizard Графика в области клиента Профилирование Глава 11. Поиск, анализ и исправление ошибок в коде MFC Проблемы с памятью Проблемный код Локализация и анализ Параметры диагностики памяти Локализация утечки памяти Распечатка статистики памяти

215 215 217 217 224 224 238 253 255 256 256 259 261 271 273 275 277 277 278 279 281 281 281 281 287 288 289 291 292 292 298 300 300 308 312 319 320 321 324 329 330 331


Исправление проекта Проблемы при построении графиков Проблемный код Локализация и анализ Исправленный проект Часть IV. Библиотека стандартных шаблонов Глава 12. Код C++, шаблоны и STL Разнообразие архитектур Приручение C++ STL — ящик со структурами? STL — первый взгляд STL и Хьюлетт-Паккард STL — в массы STL — общий вид STL и ANSI/ISO C++ Фундаментальные компоненты STL Что такое контейнер? Что такое адаптер? Что такое алгоритм? Что такое итератор? Имеются ли другие компоненты STL? Полный пакет STL Классический С, ANSI С, C++, ANSI C++ Структуры данных — обзор Статическое и динамическое Типизированные указатели «Пустые» указатели Еще раз о венгерской нотации Перегрузка функций Указатели на функцию Перегрузка операций Перегруженные операции и вызовы функций Написание перегруженных операций От структур к шаблонам Ключевое слово template Синтаксис шаблонов Шаблоны функций Шаблоны классов Почему STL лучше шаблонов Глава 13. Поиск, анализ и исправление ошибок в коде STL Проблемы перехода от стандартного C++ к синтаксису STL Обход контейнеров Более близкий взгляд на итераторы Итераторы потоков

332 336 336 341 348 353 355 356 356 358 358 359 359 360 360 361 361 363 363 364 364 365 366 367 367 368 368 371 373 373 376 377 377 379 380 380 381 381 382 385 386 386 387 388


Зачем нужен end( )! Копирование списков Списки внутри списков Неприятности с указателями на строку Освобождение указателей STL Реальный пример перехода от C++ к коду STL Шаг 1 — обновление класса aSingleCard Шаг 2 — обновление класса WarDeck Шаг 3 — коррекция ошибок STL при выполнении Шаг 4 — обновление класса Opponent Шаг 5 — работающая программа STL STL-версия wargame.cpp Часть V. Специальные задачи отладки Глава 14. Работа с DLL Создание динамически присоединяемой библиотеки на основе MFC Заголовочный файл Framer.h Файл исходного кода Framer.cpp Построение Framer.dll Создание главного приложения для тестирования DLL Заголовочный файл DLLDemoView.h Файл исходного кода DLLDemoView.cpp Обычные DLL, динамически компонуемые с библиотекой MFC Обычные DLL, статически компонуемые с библиотекой MFC Безопасные методики отладки DLL Отладка DLL Удаленная отладка Проблемный код. Исправленный код Трудности при отладке DLL Глава 15. Работа с компонентами ActiveX Разработка компонента ActiveX Элементы управления Работа с ControlWizard Тестовый контейнер Создание действительного компонента Clock Отладка компонента Clock Подготовка удаленной целевой машины Подготовка главной машины Запуск сеанса отладки Локализация проблемы Глава 16. Отладка COM, ATL и DHTML Модель объекта СОМ Создание проекта ATL Polygon Доработка кода шаблона

388 389 389 390 391 392 395 398 401 403 404 405 411 413 414 417 418 420 421 422 423 425 427 428 429 429 432 435 436 439 440 441 442 445 447 456 456 457 458 459 465 466 466 470


Тестирование компонента Точки соединения и генератор ATL-посредников. Отладка компонента ATL Глава 17. Программирование с STL и MFC Создание приложения STL / MFC Синтаксис шаблона Базовый код приложения Отладка Безопасные методики кодирования и отладки STL

483 483 484 489 490 491 496 501 505





































































































































































































































































































Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.