Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB-1-10.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
747.01 Кб
Скачать

66

Министерство образования и науки Украины

Национальный аэрокосмический университет

им. Н.Е. Жуковского «ХАИ»

Волошин О.Н., Л.Ф. Пудовкина

Методическое пособие по выполнению лабораторных работ по курсу «Системное программное обеспечение и операционные системы»

г. Харьков, 2005 г.

Предисловие

Предлагаемое издание предназначено для изучения основ программирования в инструментальной среде Visual C++ и получения практических навыков проектирования системных Win32-разрядных приложений в операционных системах Windows98/NT/XP. Его материал ориентирован на студентов, профессионально изучающих программирование на персональных ЭВМ .

Методическое пособие содержит перечень лабораторных работ по курсу «Системное программное обеспечение». В начале каждой лабораторной работы дан краткий теоретический материал, а в конце - перечень контрольных вопросов для самоконтроля студентов.

Выполняя лабораторные работы № 1-10, студенты изучают разработку Win 32-разрядных приложений в операционных системах Windows98/NT|XP. В качестве инструментальных средств разработки студенты должны использовать Visual C++, Delphi, Borland C++, Builder C++.

По окончании курса студент должен уметь разрабатывать системные Win32-разрядные приложения в операционных системах Windows/98/NT|XP.

В данное пособие включены лабораторные работы, позволяющие получить практические навыки написания Win32-разрядных системных приложений, использующих механизмы доступа к логическим томам и файлам, многозадачности, распределения памяти, работы с системным РЕЕСТРОМ, обмена данными. В качестве инструментальных средств разработки Windows-приложений студенты могут использовать следующие: Visual C++, Delphi, Borland C++, Builder C++.

Существуют различные типы Win32-разрядных приложений : традиционные Windows-приложения, использующие интерфейс графических устройств (GDI) и обрабатывающие системные сообщения Windows; консольные Win32-разрядные приложения, в окне которых отображается только текстовая информация, в этих приложениях отсутствуют окна сообщений, контексты устройств и т.д.; динамически подключаемые библиотеки DLL, которые строго говоря не являются законченным Windows- приложением, не отображают информацию на экране и не обрабатывают сообщения Windows. Программа либо явно загружает библиотеку, либо вызывает одну из функций этой библиотеки.

В системе Windows определены сотни сообщений, функции обработки которых входят в состав Win32 API ( интерфейс прикладных программ) . Win32 API реализован на четырех платформах: Win32S, Windows NT, Windows 95, WindowsCE. Приложение взаимодействует с Windows через интерфейс API. В описании лабораторных работ содержатся примеры использования Win32 API.

1. Лабораторная работа № 1.

Интегрированный отладчик Microsoft Visual C++ 6.0

Цель работы. Изучить и освоить возможности и основные приемы работы с отладчиком.

1.1. Теоретические сведения

Начинающим программистам отчасти трудно в полной мере оценить важность усвоения хороших «программных привычек», которые способствуют проектированию удобочитаемых и надежных алгоритмов. Студенческие программы, реализованные по таким алгоритмам, обычно невелики (редко более двух – трех сотен строк кода). С другой стороны, приложения реального мира могут быть очень велики (несколько тысяч или десятков тысяч строчек кода). Разрабатываются такие программы группами программистов, и используют эти программы обычно в течение долгого периода времени, поэтому требуют сопровождения, если они должны отвечать меняющимся условиям, сохраняя при этом корректность; часто программу сопровождает не написавший ее программист, а кто-то другой.

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

Обнаружение и исправление ошибок является важной частью разработки программного обеспечения и называется проверкой действительности и корректности. Под проверкой действительности понимается проверка того, что алгоритмы и программа в целом отвечают спецификациям задачи. Проверка корректности (верификация) относится к правильности и полноте алгоритмов и всей программы. Действительность можно охарактеризовать вопросом: «Решает ли программа правильную задачу?». Корректность, со своей стороны, соответствует вопросу: «Решает ли программа задачу правильно?»

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

  • Синтаксические или времени компиляции. Ошибки, возникающие во время компиляции.

  • Компоновщика. Ошибки, возникающие на этапе компоновки, которая производится для получения исполняемого файла.

  • Времени выполнения. Ошибки, возникающие при выполнении программы.

  • Логические. Приложение по видимости выполняется без ошибок, однако выдает неверные результаты.

Синтаксические ошибки. Эти ошибки являются самым частым типом ошибок. Они возникают, когда в программе встречается оператор, нарушающий какое-либо из грамматических или синтаксических правил выбранного языка программирования. Эти ошибки автоматически детектируются при компиляции программы.

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

Когда компилятор C/C++ транслирует ваш исходный код в исполняемую программу, он пытается обнаружить и сообщить о возможно большем числе синтаксических ошибок, а также предупреждает вас об операторах, которые формально законны, но могут вызвать ошибки в дальнейшем.

Компилятор Visual C++ может сообщать об объявлениях переменных, которые никогда не используются, и о чтении значения переменной до ее инициализации. Он может даже определить, что логический поток управления вашей программы не допускает исполнения некоторых сегментов кода, - в этом случае компилятор сообщает о «недостижимом коде».

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

Например, функция socket объявляется в файле <WinSock2.h>, и для правильной компиляции программы требует препроцессорной директивы #include <WinSock2.h>. Однако такая программа все равно не будет компоноваться без ошибок, потому что компоновщик не подключает сетевую библиотеку автоматически. Нужно явным образом дать ему такое указание (рис. 1.1.), либо добавив файл библиотеки Ws2_32.lib в проект, либо указав в настройках проекта (Project->Settings, вкладка Link):

Рис 1.1. Добавление библиотеки в проект

На этом рисунке в окне ввода Object/Library modules виден список используемых приложением библиотек, и Ws2_32.lib, добавленная нами.

Ошибки времени выполнения. После того, как будут устранены .все ошибки времени компиляции, и компоновщик создаст исполняемый файл, программу можно запускать на выполнение. Но ошибки могут случаться во время работы программы и способствовать аварийному (преждевременному) ее завершению, потому что происходит некоторое событие, с которым компьютер не может справиться.

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

Ошибки времени выполнения включают в себя следующее.

  • Аппаратно детектируемые ошибки, такие как деление на ноль, арифметическое переполнение, нарушение защиты памяти и ошибки устройств.

  • Системные ошибки, например, неудачная файловая операция или переполнение очереди сообщений.

  • Логические ошибки, например, выход индекса за границы массива или удаление элемента из пустой очереди.

  • Исключения или ошибки, специфичные для приложения, такие как неверный формат ввода.

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

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

Отыскивать такие ошибки проще всего с помощью символического отладчика. Отладчик Microsoft Visual C++ позволяет вам проследить выполнение программы, исполняя ее по одному оператору ( пошагово ), пока не встретится оператор, генерирующий ошибку. Как только ошибка идентифицирована, ее нужно исправить, заменив некорректный оператор корректным, а затем заново компилировать, компоновать и запустить программу на выполнение.

Логические ошибки. Из всех четырех категорий ошибок логические ошибки найти наиболее трудно, так как они берут свое начало в ошибочном рассуждении при поиске решения задачи, ошибка просто приводит к неверным результатам и иногда – к остановке приложения. Это делает необходимым проведение тестирования приложения с различными наборами входных данных. Только тщательное тестирование на самых разнообразных значениях данных может дать гарантию того, что приложение не содержит логических ошибок.

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

Другим подходом к поиску логических ошибок является вставка операторов вывода в ключевых точках программы, чтобы отображать значения переменных, участвующих в вычислении неверных результатов (printf-отладка). Прослеживая вручную выполнение кода и сравнивая выведенные значения с ожидаемыми, можно по их расхождению локализовать ошибку.

Поиск логических ошибок требует массы терпения. Чтобы по возможности избежать их появления, необходимо уделить особенное внимание первым трем этапам цикла разработки программного обеспечения: анализу и спецификации задачи, проектированию алгоритма и кодированию.

Расшифровка сообщений об ошибках. Когда вы компилируете и компонуете программу в Visual C++, автоматически открывается окно Output, отображающее информацию о статусе процесса построения, включая все предупреждения и сообщения об ошибках. Это окно может помочь вам найти и исправить причины сообщения об ошибке двумя способами:

  • автоматически проследив строку кода, генерировавшую сообщение,

  • отобразив страницу контекстно-зависимой справки, содержащей дополнительную информацию о данном сообщении.

Чтобы увидеть оператор, генерировавший некоторое сообщение, нужно просто дважды щелкнуть на этом сообщении в окне Output (либо нажать клавишу F4). Откроется нужный файл, и указатель выделит строчку, которая вызвала ошибку.

Чтобы получить справку о данном сообщении, нужно сначала щелкнуть на номере сообщения в окне Output (например, С2001) а затем нажать клавишу F1. В окне Help откроется страница справочника, соответствующая выбранному номеру ошибки.

Часто в этих справочных файлах приводится объяснение ошибки в синтаксисе или логике, которое помогает исправить ошибочный оператор.

1.2. Работа с отладчиком Microsoft Visual C++

Среда разработки Visual C++ прелагает программисту различные инструменты, позволяющие быстро и эффективно находить ошибки в исходном коде и компонентах программы.

Визуальный интерфейс отладчика включает в себя специальные меню, окна, панели диалогов. Вы можете даже пользоваться «перетаскиванием» Windows для обмена информацией между компонентами отладчика. Конфигурация отладчика должна быть установлена до того, как начнется процесс отладки.

Знание всего нескольких комбинаций «горячих клавиш» сэкономит вам время, затрачиваемое на активацию неактивных окон и необходимого помещения курсора в определенное окно, чтобы стала доступной та или иная опция.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]