Программирование - отладка
Отладка (debugging) в программировании — это этап разработки программного обеспечения, цель которого — найти и устранить ошибки в программном коде. Этот процесс позволяет разработчикам создавать более стабильные, эффективные и безопасные приложения.
Обнаружение бага — это может быть ошибка, зафиксированная в ходе тестирования, или баг, найденный пользователем.
Локализация ошибки — определение участка кода, который вызывает проблему.
Исправление — может потребовать изменения логики программы, обработки данных или вызовов функций.
Тестирование результата — позволяет убедиться, что исправление не привело к новым проблемам, проводится регресс-тестирование.
Некоторые виды отладки программного обеспечения:
Ручная — разработчик читает код и ищет в нём ошибки.
С помощью автоматизированных инструментов — в современных средах разработки отладчики встроенные, с их помощью программисты могут отслеживать, как выполняется программа, останавливать выполнение кода на каждой строке и видеть, в каких его фрагментах есть ошибки.
Удалённая отладка — процесс отладки программы, запущенной в системе, отличной от отладчика.
Посмертная отладка — отладка программы после того, как она уже завершила работу после сбоя.
-
Отладка приложений
Книга адресована разработчикам, которые хотят повысить качество своих программ и конкурентоспособность своей организации, а также для менеджеров и руководителей групп, заинтересованных в создании более действенных и эффективных команд разработчиков.
Исходя из технической перспективы, "идеальным читателем" является тот, кто имеет опыт (от одного до трех лет) в применении систем программирования Microsoft Visual C++ и/или Microsoft Visual Basic. Предполагается также, что читатель является членом реальной команды разработчиков, и отправил заказчикам, по крайней мере, один продукт.
Замечание для разработчиков на Visual Basic
Как нужно читать эту книгу
Системные требования
ПРОЧИТАЙТЕ ЭТО!
Обратная связь
Отладка приложений
Ошибки и отладка
Что такое ошибки?
Противоречивые интерфейсы пользователя
Несоответствие ожиданиям
Низкая производительность
Аварийные завершения и искажение данных
Ошибки процесса разработки и их устранение
Короткие или недопустимые предельные сроки разработки
Необдуманное программирование
Неправильное понимание требований
Недостаточная подготовленность разработчика
Недостаточные обязательства по качеству
Планирование отладки
Предпосылки к отладке
Набор навыков
Освоение набора навыков
Процесс отладки
Шаг 1. Дублируйте ошибку
Шаг 2. Опишите ошибку
Шаг 3. Всегда предполагайте, что ошибку допустили вы
Шаг 4. Разделяйте и преодолевайте
Шаг 5. Думайте творчески
Шаг 6. Используйте инструменты усиления отладки
Шаг 7. Начните интенсивную отладку
Шаг 8. Убедитесь, что ошибка исправлена
Шаг 9. Изучайте и разделяйте проблемы с коллегами
Заключительный секрет процесса отладки
Резюме
Отладка приложений
Постоянно отслеживайте изменения
Системы управления версией
Управление изменениями
Важность использования меток
Системы отслеживания ошибок
Выбор подходящих систем
Планируйте время для построения систем отладки
Стройте все конфигурации продукта с символами отладки
Рассматривайте предупреждения как возможные ошибки
Адреса загрузки DLL
Проектируйте облегченную диагностическую систему для выпускных конфигураций
Частые построения и интенсивные тесты обязательны
Частые построения
Smoke-тесты
Создайте программу установки
Специалисты по качеству должны тестировать отладочные конфигурации
Резюме
Отладка приложений
Операторы утверждений
Как и что следует проверять с помощью утверждений
Описание Функции isArray Проверяет
Обзор операторов утверждений для Visual C++ и Visual Basic
Программа SUPERASSERT
Трассировка
Комментарии
Блочное тестирование
Резюме
Отладка приложений
Типы Windows-отладчиков
Отладчики режима пользователя
Отладчики режима ядра
Поддержка подчиненных отладчиков в Windows 2000
Проверка динамических областей памяти в Windows 2000
Автоматический запуск приложений в отладчике
Быстрые клавиши прерываний
MinDBG: простой отладчик для Win32
WDBG: реальный отладчик
Чтение и запись памяти
Точки прерывания и пошаговый проход
Таблицы символов, символьные машины и проход стека
Операции Step Into, Step Over и Step Out
Интересная проблема разработки WDBG
Итак, вы хотите написать собственный отладчик?
WDBG: что делать дальше?
Резюме
Отладка приложений
Расширенные точки прерывания
Синтаксис расширенных точек прерывания и позиционные точки прерывания
Быстрое прерывание на произвольной функции
Точки прерывания на системных или экспортируемых функциях
Модификаторы позиционных точек прерывания
Точки прерывания глобальных выражений и условные точки прерывания
Условии или в данных. Если же
Точки прерывания Windows-сообщений
Удаленная отладка
Советы и специальные приемы
Установка точек прерывания
Окно Watch
Команда Set Next Statement
Отладка компилированного кода Visual Basic
Резюме
Отладка приложений
Основы CPU
Регистры
Формат инструкции и адресация памяти
Встроенный ассемблер Visual C++
Инструкции, которые нужно знать
Манипуляции со стеком
Самые общие простые инструкции
Общая последовательность: вход и выход из функции
Доступ к параметрам, глобальным и локальным переменным
Вызов и возврат из процедур
Соглашения о вызовах
Пример соглашений о вызовах
Дополнительные инструкции
Манипуляции с данными
Манипуляции с указателями
Сравнение и проверка
Инструкции переходов и ветвлений
Циклы
Манипуляции со строками
Общие конструкции языка ассемблера
Доступ через регистр FS
Создание или уничтожение SEH-кадра
Ссылки на структуры и классы
Полный пример
Окно Disassembly
Навигация
Просмотр параметров в стеке
Окна Memory и Disassembly
Советы и специальные приемы
Endians
Код мусора
Регистры и окно Watch
Изучайте ASM-файлы
Резюме
Отладка приложений
Р-код Visual Basic
Урок истории р-кода
Последствия работы с отладчиком
Перехват ошибок: режимы Break In или Break On
Режим Break On All Errors
Режим Break On Unhandled Errors
Режим Break In Class Module
Заключительные предложения по перехвату ошибок
Окна отладчика Visual Basic
Окно Locals
Окно Immediate
Окно Watch
Советы и специальные приемы
Добавьте кнопку Run To Cursor к панели инструментов Debug
Отключите режим Compile On Demand
Групповые проекты как способ перехода к отладке
Отладка и реальность
Резюме
Отладка приложений
Создание и чтение МАР-файла
Содержимое МАР-файла
Поиск функции, исходного файла и номера строки
Использование утилиты CrashFinder
Основные моменты реализации
Что делать дальше с утилитой CrashFinder?
Резюме
Отладка приложений
Структурированная обработка исключений (SEH) и обработка исключений в C++
Структурированная обработка исключений
Обработка исключений средствами языка C++
Комбинирование обработки SEH- и С++-исключений
API-функция SetUnhandledExceptionFilter
Использование CrashHandler API
Трансляция структур EXCEPTION_POINTERS
Резюме
Отладка приложений
Основы программных служб
Использование API-функций
Обеспечение безопасности
Отладка служб
Отладка основного кода
Отладка базовых служб
Резюме
Отладка приложений
Требования к TraceSrv
TraceSrv и DCOMCNFG
Первые проблемы с TraceSrv
Программа TraceView и безопасность
Применение TraceSrv
Резюме
Отладка приложений
Рекомендации и приемы работы с многопоточностью
Отказ от многопоточной организации
Реализация потоков мелкими дискретными частями
Синхронизация потоков на самом низком уровне
Постоянный просмотр кода
Тестирование на мультипроцессорных машинах
Требования утилиты DeadlockDetection
DeadlockDetection и проблемы высокоуровневого проектирования
Использование DeadlockDetection
Реализация DeadlockDetection
Основные моменты реализации
Что делать дальше с DeadlockDetection?
Резюме
Отладка приложений
Бич блочного тестирования: интерфейсы пользователя
Требования, предъявляемые к утилите Tester
Применение утилиты Tester
Реализация утилиты Tester
Что делать дальше с утилитой Tester?
Резюме
Отладка приложений
Поиск решения
Требования к LIMODS
Использование LIMODS
Работа с MFC
Вызов LIMODS из кода
Выбор исходных файлов для трассировки
Реализация LIMODS
Определение диапазонов исходного кода
Определение диапазонов исходного кода - 2
LOM-файлы
Исключение исходных файлов из LOM-файлов
Что подключает LIMODSDLL.DLL
Обработка _сdесl-подключений
Подключение функций, экспортируемых по порядковому значению
Общие проблемы реализации
Что делать дальше с LIMODS?
Резюме
Отладка приложений
Свойства библиотеки DCRT
Использование DCRT-библиотеки
Выбор правильного варианта CRT-библиотеки
Использование MemDumperValidator
Использование MemDumperValidator в приложениях C++
Применение MemDumperValidator в приложениях С
Глубокие проверки корректности
Реализация MemDumperValidator
Инициализация и завершение в C++
Куда направляются отчеты об утечках памяти?
Использование утилиты MemStress
Интересная "стрессовая" проблема
Резюме
Отладка приложений
Журнал программы Dr. Watson для Windows 2000
Журнал программы Dr. Watson для Windows 98
Книги
Разработка программного обеспечения
Языки
Отладка и тестирование
Windows и Windows-технологии
CPU и аппаратные средства
Инструментальные средства
Web-сайты
Позиционные точки прерывания
Модификаторы позиционных точек прерывания
Точки прерывания глобальных выражений и условные точки прерывания
Точки прерывания сообщений
-
Погружение в технику и философию gdb
Под LINUX/ BSD существует множество отладчиков, но общепризнанный лидер это, бесспорно, GDB, входящий в состав практически любого дистрибутива. Внешне (только внешне!) схожий с debug.com, он так и дышит мощью, поражающей воображение и потрясающей создание по мере его освоения
собственная интерактивная "морда" отладчика gdb
Подготовка к отладке
Листинг2 загрузка файла gdb-demo в отладчик из командной строки с аргументами
Листинг3 загрузка файла gdb-demo из отладчика
Листинг4 установка точки останова на main
Листинг5 загрузка программы со стрипнутой символьной инфой
Листинг6 подключение к уже запущенному процессу через командную строку
Листинг7 подключение к уже запущенному процессу командной attach
зацикливание программы в hiew'e
Листинг8 загрузка зацикленного файла с потрепанным заголовком и восстановление оригинальных байт
Листинг9 восстановление ячеек памяти с использованием переменной $i
Листинг10 объявление пользовательской переменной dd, записывающей байт по указанному адресу
Листинг11 восстановление ячеек памяти через пользовательскую команду
Листинг12 файл n2k_cmd, содержащий определение команды dd
Прежде, чем начинать трассировку
Листинг 13 отображение машинной команды по заданному адресу
Листинг14 автоматическое отображение 3х инструкций при трассировке в формате ATT
Листинг15 автоматическое отображение 3х инструкций при трассировке в формате Intel
Листинг16 демонстрация возможностей print
Заключение
Погружение в технику и философию gdb (окончание)
Изменение потока выполнения
Листинг 1 фрагмент цикла, демонстрирующего сущность команды until
Трассировка
Точки останова
реальная установка точек останова происходит только при начале выполнения программы
Листинг2 при установке точки наблюдения/останова
Листинг3 автоматическое исполнение
Листинг4 просмотр информации о точке наблюдения номер 13
Работа с памятью и регистрами
Листинг 5 чтение и модификация памяти при помощи команды p (print)
Листинг6 отображение дампа программы с помощью команды "x"
Листинг7 исходный код пользовательской команды ddd, выводящий дамп в стиле soft-ice и turbo-debugger
Листинг8 дамп памяти, выведенный пользовательской командой "ddd"
Обработка сигналов
просмотр реакции отладчика gdb на различные сигналы
Листинг9 дизассемблерный фрагмент файла, защищенного протектором burneye
попытка отладки программы
-
Трассировка и отладка в .NET
Cложные приложения не всегда удается эффективно отлаживать под управлением отладчика, чтобы узнать, что пошло не так, как надо Дублирование, а также написание условий, необходимых для отладки, становится зачастую сложной задачей В пространстве имен System: : Diagnostics (Система Диагностика) есть определенные классы, которые помогают оснастить ваше приложение инструментальными средствами
Оснастив приложение необходимыми инструментальными средствами, в процессе отладки и трассировки вы сможете сделать его более устойчивым При этом также проясняется общий шаблон того, как каркас разбивает классы на отдельные задачи (запись вывода, управление выводом, назначение вывода) так, чтобы можно было настроить эти отдельные части, и в остальном полностью полагаться на классы Framework Механика оснащения приложения имеет три аспекта
Классы Trace (Трассировка) и Debug (Отладка) используются для генерации вывода трассировки и отладки Они имеют идентичные методы и свойства, которые позволяют выводить диагностику Однако эти классы не определяют назначение вывода
Классы Listeners (Слушатели) используются для направления вывода на различные устройства, хотя в то же время существует и назначение, принятое по умолчанию
Макроопределения Idef me DEBUG и tfaefine TRACE могут использоваться наряду с макросами lifdef и tendif для включения и отключения документирования Эти макро-флаги могут использоваться для того, чтобы различать отладочные и рабочие конструкции приложения Можно также поставить вывод классов Trace (Трассировка) и Debug (Отладка) в зависимость от значений условных выражений И наконец, можно управлять детализацией вывода, исходя из потребности в информации, с помощью классов BooleanSwitch и TraceSwitch
Класс TraceListener
Коллекция слушателей
Резюме
Пример TraceDemo
Разворачивание TraceDemo.exe.config
Окно визуальной среды разработки Visual Studio для дополнительного шага компоновки
Использование классов Debug (Отладка) и Trace (Трассировка)
Использование переключателей для активизации диагностики
Активация и деактивация переключателей
Установка переключателей в файле конфигурации
Установка переключателей программным путем
Использование переключателей для управления выводом
Смешивание управляемого и неуправляемого кода
Index0
Смешивание управляемого и неуправляемого кода
Сервисная программа Tibinp. ехе
Унаследованный компонент на основе модели компонентных объектов Microsoft (COM)
Как создать и использовать упаковщик, вызываемый во время выполнения (Runtime Callable Wrapper, RCW)
Утилита Ildasm.exe показывает
Действующий клиент на основе модели компонентных объектов Microsoft (COM)
Создание клиента на основе модели компонентных объектов Microsoft (COM) с помощью управляемого C++
Разработка управляемого клиента на основе модели компонентных объектов Microsoft (COM) с помощью С#
Создание с помощью управляемого
Создание с помощью С# управляемого
Размещение и маршалинг
Доступ к управляемым компонентам из клиентов на основе модели компонентных объектов Microsoft (COM)
Раннее связывание клиента на основе модели компонентных объектов Microsoft (COM) с компонентами .NET
Вызываемый упаковщик на основе
Утилита Oleview exe показывает
Утилита Regedt32.exe показывает
Динамическое связывание клиента
Клиент Visual Basic для компонента .NET
Как строить и запускать исполняемый файл на Visual Basic
Сравнение управляемого и неуправляемого кода
Явное определение интерфейса
Службы обращения к платформе: Plnvoke (Platform Invocation Services)
Это окно сообщения будет выведено при выполнении программы PInvoke.cpp
Резюме
Причины смешивания управляемого и неуправляемого кодов
Неуправляемый или опасный?
Управляемые и неуправляемые ссылки и типы значений
Ограничения на использование управляемых типов в C++
Вызов управляемого кода из неуправляемого и обратный вызов
Сравнение программирования на
Доступ из управляемого кода к
Упаковщик, вызываемый во время совместного выполнения управляемого и неуправляемого кодов
Visual Studio.NET
Index0
Visual Studio.NET
Запуск программы в отладчике
Конфигурирование проектов
Создание новой конфигурации
А.8. Выбор конфигурации Release (Выпуск) в Configuration Manager (Диспетчер конфигурации)
Установка параметров компоновки приложения в конфигурации
А.9. Создание новой конфигурации
А.10. Изменение параметров компоновки в конфигурации
Отладка
Оперативная отладка
А.11. Диалог "Just-In-Time
Обычная отладка, точки останова
А.12. Выполнение программы приостановлено в точке останова
А.15 иллюстрирует установку
Выполнение в пошаговом режиме
А.17. Стек вызова отображается в диалоговом окне Call Stack (Стек вызова)
Резюме
Обзор Visual Studio.NET
А 1 Главное окно Visual Studio NET
А.2. Страница выбора профиля Visual Studio NET
А.3. Консольный проект в Visual Studio NET
А.4. Горизонтальная линейка вкладок для открытых файлов исходных кодов
Панели инструментов
Изменение панелей инструментов
Создание консольного приложения
А. 5. Добавление команды на панель инструментов
Создание проекта C++
А.6. Создание консольного проекта Managed C++
Добавление файла на C++
А.7. Добавление пустого файла заголовков в проект на C++
Использование текстового редактора Visual Studio
Компиляция проекта
Запуск программы
-
Методы предотвращения ошибок
Команда удаления файла в любой операционной системе снабжена требованием подтвердить удаление. Этот метод приносит пользу только начинающим пользователям, которые проверяют каждый свой шаг. Для опытных пользователей это диалоговое окно с требованием подтверждения не работает.
Повышение разборчивости и заметности индикаторов
Блокировка потенциально опасных действий до получения подтверждения
Проверка действий пользователя перед их принятием
Самостоятельный выбор параметров