Сидоров А.О / ос2
.docx
Министерство образования Республики Беларусь
Белорусский Национальный Технический Университет
Факультет информационных технологий и робототехники
Кафедра «Программное обеспечение вычислительной техники
и автоматизированных систем»
Отчёт
по лабораторной работе № 2
по дисциплине «Операционные системы»
тема: «Компиляция и отладка приложений в Linux»
Исполнитель: |
|
студент группы 10702112 Сидоров А.О. |
Преподаватель: |
|
Радкевич А.С. |
2013-2014 учебный год
ЛАБОРАТОРНАЯ РАБОТА № 2
КОМПИЛЯЦИЯ И ОТЛАДКА ПРИЛОЖЕНИЙ В LINUX
Цель работы
Изучить инструментарий разработки приложений для Linux и фундаментальные основы системного программирования с использованием утилит gcc (g++) и gdb для создания, компиляции и отладки приложений на языке программирования С/C++.
Требования
-
Разработать приложение согласно варианту бригады. Во всех программах необходимо ввести N-строк, используя два способа ввода: через аргументы командной строки и стандартного ввода данных во время работы программы. Запустить программу в режиме отладки и продемонстрировать знания основных команд gdb.
-
При разработки программы использовать модульный принцип.
-
Во время работы программы должны выводить на экран исходные и конечные данные.
-
При выполнении задания запрещается использовать интегрированные средства разработки (Integrated Development Environment, IDE). Рекомендуется задействовать любой текстовый редактор (к примеру, gedit) и набор компиляторов GNU Compiler Collection (GCC), в частности, компилятор языка программирования С/C++ gcc/g++.
-
При разработке программ придерживайтесь соглашений по написанию кода на C/C++ (Code-Convention).
Индивидуальное задание:
Найти слово, состоящее только из различных символов. Если таких слов несколько, найти первое из них.
Ход выполнения лабораторной работы:
-
Установил соответствующий инструментарий для выполнения лабораторной работы (gcc, g++ и gdb).
-
Для удобства навигации по файлам установил дополнительно файловый менеджер GNOME Comander.
-
В текстовом редакторе gedit набрал исходный код решения задания на языке программирования С++ и сохранил исходник с именем. Программа состоит из следующих файлов (см. рис. 1):
-
functions.h – файл заголовка, в котором описаны прототипы функций разделения строки на слова, и поиск первого слова, состоящего из различных символов.
-
functions.cc – файл реализации функций;
-
test.cc – файл, в котором описана главная функция программы main;
-
Запустил терминал Linux и с помощью команды cd перешёл в папку местонахождения исходных кодов программы.
-
Для компиляции программы использовал компилятор g++ с вводом соответствующих параметров (см. рис. 1);
-
Для тестирования работоспособности запустил программу с соответствующими аргументами командной строки (см. рис. 1).
-
Для отладки программы использовал gdb (см. рис. 2).
Результаты выполнения лабораторной работы:
Рисунок 1 — Компиляция и выполнение программы test
Рисунок 2 — Запуск и отладка программы test с использованием gdb
Что я освоил в процессе выполнения лабораторной работы:
-
Процесс создания исполняемой программы.
-
Базовые основы разработки программ на языке программирования С/С++.
-
Изучил некоторые команды (ls, cd, clear, man, info, ...) для работы в Linux-терминале.
-
Научился компилировать и запускать C/C++ программы с использованием gcc и g++ компиляторов.
-
Научился отлаживать работу программы с использованием встроенного отладчика gdb.
-
Разобрался в процессе создания компилятором выполняемой программы, а также как воедино собрать проект, который написан с использованием модульного принципа.
Выводы:
-
Процесс создания исполняемой программы включает в себя четыри стадии:
-
написание исходного кода прогарммы (получаем файлы *.h, *.с / *.сс);
-
обработка исходного кода программы препроцессором;
-
компиляция преобразованного исходного файла препроцессором в набор машинных команд (результат сохраняется в объектных файлах с расширением *.o);
-
компоновка (или линковка);
-
Для быстрого запуска Linux-терминала используеться следующее сочетание клавиш на клавиатуре: «Alt»+«Ctrl»+«T».
-
GCC (GNU Compiler Collection) – набор компиляторов для различных языков программирования, разработанный в рамках проекта GNU. GCC используется как стандартный компилятор для свободных UNIX-подобных операционных систем.
-
GNU Debugger — переносимый отладчик проекта GNU, который работает на многих UNIX-подобных системах и умеет производить отладку многих языков программирования, включая Си, C и др. В ходе выполнения лабораторной работы были изучены такие команды GNU GDB, как :
-
break – установка точки останова, а delete – удаляет точку останова;
-
run – запуск программы внутри отладчика;
-
list – просмотр исходного кода;
-
info breakpoints – просмотр всех точек останова;
-
print – показывает чему равно на данном этапе значение переменной;
-
display – величина переменной будет показываться каждый раз, когда программа останавливается, без специального указания;
-
clear – удаляет все точки останова на текущем уровне стека (то есть в текущей функции);
-
continue – продолжение выполнения программы
-
set – прямо во время выполнения программы изменяет значение переменной;
-
step - проходим программу, останавливаясь на каждой строчке;
-
next - при вызове функции, программа не входит в неё, а продолжает дальше выполняться только на текущем уровне стека;
-
finish - выполняет программу до выхода из текущей функции;
-
g++ – традиционное обозначение GNU C++, свободно распространяемого компилятора языка C++. Является частью GCC – коллекции компиляторов GNU.
ПРИЛОЖЕНИЕ A
Листинг исходного кода программы
Файл functions.h
#ifndef function_H
#define function_H
int poisk(char *s);
int l(char *s,char str[]);
#endif
Файл functions.cc
#include <string.h>
#include <stdio.h>
#include <iostream>
#include "function.h"
using namespace std;
int poisk(char *s){
int cnt=0,f;
for(int i=0;i<strlen(s);i++){
f=1;
for(int j=0;j<strlen(s);j++){
if(i!=j&&s[i]==s[j])
f=0;
}
if(f)
++cnt;
}
return cnt;
}
int l(char *s,char str[])
{
int m=1;
s=strtok(str," ,.!?()");
while(s){
if (poisk(s)==strlen(s)&&m==1){
m=0;
cout<<"Slovo:";
puts(s);
}
s=strtok(NULL," ,.!?()");
}
return 0;
}
Файл test.cc
#include <stdio.h>
#include <iostream>
#include "function.h"
using namespace std;
int main(int size,char **argv)
{
char str[100],*sp;
if(size>1){
l(*argv,argv[1]);
}else{
cout<<"\nString: ";
fgets(str,255,stdin);
l(sp,str);
}
return 0;
}