Системное программное обеспечение. Учебно-методическое пособие
.pdfФедеральное агентство связи
Федеральное государственное бюджетное образовательное учреждение высшего образования «Сибирский государственный университет телекоммуникаций и информатики»
(СибГУТИ)
С.Н. Мамойленко, А.В. Ефимов
Системное программное обеспечение
Учебно-методическое пособие
Новосибирск
2018
УДК 004.457, 004.451.3
Утверждено редакционно-издательским советом СибГУТИ
Рецензент: канд. техн. наук, доц. Нечта И.И.
Мамойленко С.Н., Ефимов А.В. Системное программное обеспечение: Учебно-методическое пособие / Сибирский государственный университет телекоммуникаций и информатики; каф. вычислительных систем. – Новосибирск, 2018. – 33 с.
Учебно-методическое пособие предназначено для студентов, обучающихся по направлению 09.03.01 «Информатика и вычислительная техника» или 02.03.02 «Фундаментальная математика и информатика» и изучающих дисциплину «Системное программное обеспечение».
В пособии содержатся теоретический материал и задания, необходимые для выполнения и защиты практических занятий по указанной дисциплине. В частности, рассматриваются утилиты для отладки программного обеспечения, вопросы динамического управления памятью, а также возможности статических и динамических библиотек.
©Мамойленко С.Н, Ефимов А.В., 2018
©Сибирский государственный университет телекоммуникаций и информатики, 2018
ОГЛАВЛЕНИЕ |
|
|
ВВЕДЕНИЕ.............................................................................................................. |
4 |
|
ОТЛАДКА ПРИЛОЖЕНИЙ.................................................................................... |
5 |
|
1. |
Общие сведения о разработке программного обеспечения....................... |
5 |
2. |
Процедура локализации и исправления ошибок........................................ |
5 |
3. |
Отладчик программного обеспечения GDB. Общие сведения ................. |
7 |
4. |
Работа в командном режиме GDB.............................................................. |
8 |
5. |
Подготовка программ для отладки с помощью GDB ................................ |
9 |
6. |
Запуск и остановка процессов в отладчике GDB..................................... |
10 |
7. |
Остановка и возобновление программ ..................................................... |
13 |
8. |
Получение информации о ресурсах в процессе отладки программ........ |
15 |
ЛАБОРАТОРНАЯ РАБОТА № 1.......................................................................... |
16 |
|
Цель |
..................................................................................................................... |
16 |
Задание ................................................................................................................ |
16 |
|
Контрольные вопросы ........................................................................................ |
17 |
|
ДИНАМИЧЕСКОЕ УПРАВЛЕНИЕ ПАМЯТЬЮ................................................ |
18 |
|
1. |
Общие сведения о динамическом управлении памятью ......................... |
18 |
2. |
Функции динамического управления памятью библиотеки GLIBC....... |
19 |
3. |
Адресное пространство процесса и область динамической памяти....... |
20 |
4. |
Структура блоков динамически выделяемой памяти.............................. |
22 |
5. |
Конфигурирование подсистемы динамического управления памятью.. |
23 |
6. |
Алгоритмы поиска свободных блоков памяти......................................... |
24 |
7. |
Перехват вызовов функций динамического управления памятью ......... |
24 |
ЛАБОРАТОРНАЯ РАБОТА № 2.......................................................................... |
26 |
|
Цель |
..................................................................................................................... |
26 |
Задание ................................................................................................................ |
26 |
|
Контрольные вопросы ........................................................................................ |
26 |
|
РАЗДЕЛЯЕМЫЕ БИБЛИОТЕКИ ......................................................................... |
27 |
|
1. |
Динамические и статические библиотеки функций. ............................... |
27 |
2. |
Динамическая загрузка функций.............................................................. |
27 |
3. |
Динамическая компоновка приложений .................................................. |
30 |
ЛАБОРАТОРНАЯ РАБОТА № 3.......................................................................... |
31 |
|
Цель |
..................................................................................................................... |
31 |
Задание ................................................................................................................ |
31 |
|
Контрольные вопросы ........................................................................................ |
31 |
|
ЗАКЛЮЧЕНИЕ...................................................................................................... |
32 |
|
ВВЕДЕНИЕ
Учебное пособие содержит материал, составляющий основу курса «Системное программное обеспечение» для направлений «Информатика и вычислительная техника» и «Фундаментальная математика и информатика» (квалификация бакалавр), который также может быть полезен при изучении особенностей разработки программного обеспечения.
Под системным программным обеспечением (СПО) понимается комплекс программ, реализующих функции управления аппаратными ресурсами ЭВМ, такими как процессор, оперативная память, устройства ввода-вывода, а также предоставляющих сервисные функции доступа к ресурсам пользовательских прикладных программ, которые решают конкретные практические задачи.
Как правило, к СПО относятся операционные системы (ОС), сервисные программы (утилиты), системы программирования, системы управления базами данных, широкий класс связующего программного обеспечения.
Впервом разделе будут рассмотрены общие вопросы разработки программного обеспечения и сервисная программа GDB (GNU Debugger), предназначенная отладки программного обеспечения. Утилита позволяет контролировать ход выполнения компьютерных программ.
Во втором разделе приводится описание библиотеки GLIBC (GNU C Library), которая обеспечивает системные вызовы и основные функции динамического управления памятью ЭВМ. Приводятся примеры программ, в которых используются функции malloc, free, realloc, calloc и др.
Втретьем разделе описаны возможности статических и динамических библиотек. Приводятся примеры создания и использования динамических библиотек.
ОТЛАДКА ПРИЛОЖЕНИЙ
1. Общие сведения о разработке программного обеспечения
Стадии и этапы разработки программного обеспечения определены в Единой системе программной документации (ЕСПД) ГОСТом 19.102-77. Основная разработка программного обеспечения осуществляется на этапе формирования рабочего проекта. Этот этап включает в себя процессы: разработки программного обеспечения, его отладки, создания программной документации и проведения испытаний. Последовательность и/или одновременность выполнения процессов зависит от применяемой технологии разработки программного обеспечения.
В терминах государственного стандарта под отладкой понимается процесс, позволяющий получить программное обеспечение, которое при заданных входных данных дает определённый результат. Этот процесс заключается в выполнении двух процедур: «тестирования» и «локализации и исправления ошибок».
Тестирование – это последовательность действий, направленных на обнаружение несоответствий функционирования программного обеспечения требованиям технического задания на его разработку. Конкретные причины несоответствий определяются в процедуре локализации и исправления ошибок. Именно эту процедуру, по аналогии с англоязычным термином debug, в российской литературе называют дебагингом или отладкой. Очевидно, что процедуры тестирования и локализации и исправления ошибок дополняют друг друга.
Испытание – это процесс демонстрации программного обеспечения с целью фиксации факта выполнения им всех функций, определённых в техническом задании. Испытание – это элемент сдачи готового проекта заказчику. По сути, этот процесс аналогичен процедуре тестирования программного обеспечения.
2. Процедура локализации и исправления ошибок
Рассмотрим процедуру локализации и исправления ошибок подробнее. Далее по тексту термины «процедура локализации и исправления ошибок» и «отладка» будут считаться синонимами.
Отладка заключается в выполнении (пошаговом) программы и анализе её поведения, состояния вычислительных ресурсов и их изменений. В процессе отладки используются заранее определённые входные данные. В некоторых случаях производится принудительное изменение состояния вычислительных ресурсов и поведения программы.
Процедура локализации и исправления ошибок может осуществляться с применением:
механизма исключений. Операционная система вносит ряд ограничений на допустимые действия, которые может выполнять программное обеспечение. Программа принудительно завершается или
выдает некоторое сообщение при возникновении недопустимых событий (исключений);
журналирования (вывода) текущего состояния программного обеспечения. Обычно эта процедура производится с помощью расположенных в критических точках программы операторов вывода. Программа может самостоятельно завершиться при возникновении некоторых событий;
отладчиков – специальных системных программ, которые позволяют пошагового выполнить программное обеспечение и понаблюдать за изменением состояния вычислительных ресурсов.
Это интересно. Термин баг (англ. bug – насекомое) применяется для обозначения ошибки в программном обеспечении. Считается, что этот термин в компьютерной индустрии появился в 1945 году благодаря учёной из Гарвардского университета Грейс Хоппер, которая во время тестирования вычислительной машины Mark II Aiken Relay Calculator нашла в ней мотылька, застрявшего между контактами электромеханического реле. Извлечённое насекомое было вклеено скотчем в технический дневник, с сопроводительной надписью: «First actual case of bug being found» («первый реальный случай, когда был найден жук»). В действительности слово «bug» задолго до этого употреблялось персоналом телеграфных и телефонных компаний в отношении неполадок с электрооборудованием и радиотехникой. Во время Второй мировой войны словом «bugs» назывались проблемы с радарной электроникой.
Описанные выше способы отладки расположены в порядке увеличения функционала, доступного разработчику программного обеспечения. В случае отладки с применением механизма исключений возможно лишь удостовериться, что программа не выполняет никаких недопустимых действий. Проверить, каким образом изменяются вычислительные ресурсы в процессе выполнения программы, и вмешаться в этот процесс невозможно. Во втором случае программное обеспечение самостоятельно сообщает, какие изменения им производятся, но вмешаться в сам процесс выполнения программы невозможно. При этом если в процессе отладки возникает необходимость получить дополнительные сведения об изменениях вычислительных ресурсов, то это становится возможным только после изменения исходного кода программы, её перекомпоновки и повторного запуска программы на выполнение. С применением отладчика доступен самый полный функционал – на любом этапе выполнения программы возможно посмотреть состояние всех вычислительных ресурсов и, при необходимости, изменить их или даже изменить саму исполняющуюся программу.
Следует отметить, что с применением указанных выше процедур процесс отладки программного обеспечения может осуществляться либо поэтапно (т.е. каждая отдельная функционально завершенная его часть, например, процедура, функция, модуль и т.п., проверяется отдельно), либо единовременно. Очевидно,
что в степень сложность отладки в первом случае может быть значительно меньше, чем во втором.
3. Отладчик программного обеспечения GDB. Общие сведения
На рынке системного программного обеспечения представлены различные отладчики, отличающиеся реализуемым функционалом, поддерживаемыми языками программирования, средами исполнения программ и предназначенные для использования в различных операционных системах. В среде GNU/Linux наибольшее распространение получил отладчик GDB (сокр. от англ. GNU Debugger), изучению которого посвящена лабораторная работа.
Отладчик GDB первоначально был разработан Ричардом Столмененом в 1988 году. За основу GDB был взят отладчик DBX, поставлявшийся в то время с дистрибутивом операционной системы BSD. В настоящее время разработка отладчика координируется Управляющим комитетом GDB (GDB Steering Committee). В действующей версии (7.6) отладчик поддерживает приложения, написанный на языках: Си, Си++, Фортран, Java, Chill, ассемблер и Модула-2.
Работа GDB осуществляется в командном режиме. Существуют надстройки и интегрированные среды разработки программного обеспечения, использующие GDB и реализующие графический интерфейс к нему (например, DDD, Eclipse и т.п.). В данной лабораторной работе рассматривается «родной» командный интерфейс отладчика (см. рис. 1).
$ gdb ./a.out (gdb) run
Starting program: /home/user/a.out
Рис. 1. Пример сеанса работы отладчика GDB
Отметим, что далее в примерах сеансов работы с командной строкой и отладчиком GDB, символом $ в начале строки обозначается приглашение командной оболочки, символами (gdb) – приглашение отладчика GDB. В примерах командных строк символами [] обозначаются необязательные параметры, – - короткая опция (состоящая из одного символа, короткие опции могут группироваться), -- - длинная опция, | - альтернативные значения параметра, <> - нажатие клавиш или их комбинации. Подробнее обо всех параметрах командной строки изучаемых программ можно найти в справочнике MAN.
Для запуска отладчика в интерактивном режиме используется команда (см. рис. 2), в которой не указано ни одного параметра.
$ gdb [program] [core | process_id] [опции]
Рис. 2. Команда запуска отладчика GDB
Если пользовать хочет указать исполняемый файл программы, которую необходимо отладить, то он указывает её первым параметром. В этом случае отладчик самостоятельно создаст процесс, в котором будет исполняться и
отлаживаться указанная программа. Если необходимо произвести отладку уже исполняющегося процесса, то пользователь указывает в качестве второго параметра его номер. В случае если необходимо проанализировать причину аварийной остановки программы, то вторым параметром пользователь указывает имя файла с дампом памяти (core). Дополнительно пользователь может указать опции, уточняющие работу отладчика GDB (см. Табл. 1).
Табл. 1. Некоторые опции командной строки отладчика GDB
Опция |
Назначение |
|
|
|
-help |
Вывод подсказки по параметрам командной строки |
|||
-s file | --symbols file |
Указание файла, содержащего отладочную |
|||
|
информацию исследуемой программы |
|||
-x file | --command file |
Требование |
исполнения |
последовательности |
|
|
команд, расположенных в файле. |
|||
-batch |
Запуск отладчика в пакетном режиме. Используется |
|||
|
для |
автоматизированного |
тестирования |
|
|
программного обеспечения. |
|
||
-t device | -tty device |
Устройство для перенаправления ввода/вывода |
|||
|
исследуемой программы |
|
||
--args arg1 agr2 … |
Аргументы командной строки для исследуемой |
|||
|
программы. Эта опция всегда является последней. |
|||
4.Работа в командном режиме GDB
Вкомандном режиме отладчик ожидает от пользователя указаний, что ему следует сделать. Каждое указание (команда) – это последовательность символов, расположенных в одной строке, набор которых заканчивается нажатием клавиши <ENTER>. Если указание пустое, т.е. не содержащее ни одного символа, то отладчик повторяет предыдущее указание (за исключением некоторых случаев). Длина строки не имеет ограничений. Символ # имеет специальное значение – это начало комментария. Все символы строки, следующие за этим символом, игнорируются.
Каждое указание начинается с команды, которая отделяется от остальной части строки символом пробел. После команды могут следовать параметры, уточняющие команду. Многие команды имеют как длинные имена, так и короткие аналоги.
Для удобства ввода в GDB предусмотрен механизм подсказок по командам, который доступен при нажатии клавиши <TAB>. Набрав начальные символы и нажав <TAB>, пользователь получит список команд, которые начинаются с набранных символов. Если такая команда только одна, то она автоматически подставится в командную строку. Такой же способ можно использовать для подстановки имен переменных и функций в исследуемой программе. Для этого надо перед началом строки поставить символ ‘ (апостроф).
Для получения подсказки по командам в GDB используется команды help, apropos, complete (см. рис. 3). Первая команда выдает краткую справку,
вторая – список команд, в которых встречается указанная комбинация символов, третья – список команд, начинающихся на указанную последовательность символов (аналог нажатия клавиши <TAB>). Подробную информацию по командам следует искать в документации, расположенной на официальном сайте проекта.
(gdb)help set width
Set number of characters where GDB should wrap lines of its output. This affects where GDB wraps its output to fit the screen width. Setting this to zero prevents GDB from wrapping its output.
Рис. 3. Пример использования команды help
5. Подготовка программ для отладки с помощью GDB
Отладчик GDB может запустить любую программу, записанную в форматах a.out, COFF, ECOFF, XCOFF, ELF, SOM. Запустив отладку,
пользователь имеет возможность посмотреть состояние ресурсов, а также получить информацию об исполняемом коде программы в виде ассемблерных инструкций (см. рис. 4). Очевидно, что такой способ анализа программы не всегда удобен. Для того чтобы отладчик мог выводить информацию в понятной разработчику форме (на соответствующем языке высокого уровня), необходимо ему сообщить где находятся файлы с исходными кодами и указать связь между машинными инструкциями и строками программы. Эта информация называется символьной или отладочной и располагается она либо в том же исполняемом файле, либо отдельно.
Для того чтобы исполняемый файл был дополнен символьной информацией при компиляции программы с помощью GCC следует указать опцию –g (см. рис. 5). Дополнительно к опции можно указать параметр gdb, определяющий, что символьная информация предназначается для использования отладчиком GDB, а также задать уровень детализации отладочной информации (в примере задан максимальный уровень детализации
– 3).
Очевидно, что отладочная информация увеличивает размер исполняемого файла. Допускается разделения исполняемого кода программы и отладочной информации. В дальнейшем символьная информация может быть загружена отладчиком также отдельно.
Выделить отладочную информацию из исполняемого кода можно с помощью утилиты objcopy (см. рис. 6). В первой строке примера создается файл file.debug, в который копируется символьная информация из файла file. Во второй строке в файле file делается служебная запись о том, что символьная информация находится в другом файле. В третьей строке символьная информация удаляется из файла file. Вывести информацию о символьной информации, имеющейся в файле, можно с помощью утилиты objdump c опцией – g.
$ gdb ./f –silent
Reading symbols from /home/user/f...(no debugging symbols found)...done.
(gdb) break *0x400538 Breakpoint 1 at 0x400538 (gdb) r
Starting program: /home/user/f Breakpoint 1, 0x0000000000400538 in ?? ()
Missing separate debuginfos, use: debuginfo-install glibc-2.17-
4.fc19.x86_64 |
|
|
(gdb) x/20i $pc-16 |
0x4004a0 |
|
0x400528: |
jmpq |
|
0x40052d: |
nopl |
(%rax) |
0x400530: |
push |
%rbp |
0x400531: |
mov |
%rsp,%rbp |
0x400534: |
sub |
$0x10,%rsp |
=> 0x400538: |
addl |
$0xc7,-0x4(%rbp) |
0x40053f: |
mov |
-0x4(%rbp),%eax |
0x400542: |
mov |
%eax,%esi |
0x400544: |
mov |
$0x4005f0,%edi |
0x400549: |
mov |
$0x0,%eax |
0x40054e: |
callq |
0x400410 <printf@plt> |
0x400553: |
mov |
$0x0,%eax |
0x400558: |
leaveq |
|
0x400559: |
retq |
0x0(%rax,%rax,1) |
0x40055a: |
nopw |
|
0x400560: |
push |
%r15 |
0x400562: |
mov |
%edi,%r15d |
0x400565: |
push |
%r14 |
0x400567: |
mov |
%rsi,%r14 |
0x40056a: |
push |
%r13 |
(gdb) |
|
|
Рис. 4. Пример отладки программы, не имеющей символьной (отладочной)
$ gcc –Wall –ansi –pedantic –ggdb3 –o file file.c
Рис. 5. Командная строка компиляции программы с включением отладочной
$ objcopy --only-keep-debug file file.debug $ objcopy --add-gnu-debuglink=file.debug file $ strip –g file
Рис. 6. Выделение отладочной информации
из исполняемого файла file в отдельный файл file.debug
6. Запуск и остановка процессов в отладчике GDB
Чтобы начать отладку программы, в отладчике GDB используется команда run (см. рис. 7). Исполняемый файл, который следует запустить для
