Особенности использования отладчика GDB. лаб 2. Особенности использования отладчика gdb
Скачать 264.45 Kb.
|
Балтийский государственный технический университет «ВОЕНМЕХ» им. Д. Ф. Устинова Кафедра О7 «Информационные системы и программная инженерия» Лабораторная работа №2 по дисциплине «Компьютерный практикум» на тему «Особенности использования отладчика GDB» Вариант 9 Выполнил: Студент Группа Преподаватель: Санкт-Петербург 2021 г. Задание к лабораторной работе Часть I 1. Написать программу 1 в соответствии с вариантом при помощи любого текстового редактора. 2. Скомпилировать программу с добавлением в файл отладочной информации. 3. Используя отладчик GDB, проверить значение вычисляемого в цикле выражения на каждом шаге цикла. При использовании нескольких циклов проверить все значения. 4. В отчете привести используемые команды отладчика и полученный результат. Часть II 1. Написать программу 2 в соответствии с вариантом при помощи любого текстового редактора. 2. Для ввода и вывода строки использовать отдельные функции. 3. Скомпилировать программу с добавлением в файл отладочной информации. 4. Используя отладчик GDB, проверить содержимое стека при входе в функции ввода и вывода строки и выходе из них. 5. В отчете привести содержимое стека и используемые команды. Часть III 1. Написать программу 3 в соответствии с вариантом при помощи любого текстового редактора. 2. Для ввода и вывода строки использовать отдельные функции, помещенные в статическую библиотеку. 3. Скомпилировать программу с добавлением в файл отладочной информации. 4. Используя отладчик GDB, проверить содержимое стека при входе в функции ввода и вывода строки и выходе из них. 5. В отчете привести содержимое стека и используемые команды. Задание 1 1. С клавиатуры вводится последовательность натуральных чисел, признак окончания ввода – ввод нуля. Найти все числа, оканчивающиеся на 7. Исходный код программы main1.c #include #include int main() { int x=-1; int* arr; int size = 0; arr = (int*)malloc(50*sizeof(int)); while (x != 0) { scanf("%d", &x); if (abs(x % 10) == 7) { *(arr+(size++)) = x; } } printf("\nNumbers with 7 at the end: "); int i; for (i=0; i { printf("%d ", *(arr+i)); } system("PAUSE"); return 0; } Отладка Для начала скомпилируем файл main.c командой gcc –gmain1.c –omain1.exe Затем начнем отладку программы при помощи команды gdb main1.exe. В консоль будет выведена информация об отладчике, приведенная на рисунке 1. Рисунок 1 – Информация об отладчике Для отладки поставим точку останова на 14-ой строчке кода, находящейся в теле первого цикла, и запустим программу (рисунок 2). На каждом шаге цикла будем проверять значение *arr (первого элемента массива). Как видно по рисунку, значение *arr изначально было -1163005939 – значение по умолчанию, а как только пользователь ввёл число, оканчивающееся на 7, это значение изменилось на данное число. Р исунок 2 Задание 2 Дана строка символов до точки. Оставить в ней только слова, начинающиеся на буквы «A», «D», «K», «P». Исходный код программы main2.c #include #include #include void read_str(char* str) { gets(str); } void print_str(char* str) { printf("%s\n", str); } int main() { char str[50], buf[50]; printf("Enter string: "); read_str(str); int i, word=0, save_word = 0, buf_size = 0; for (i=0; i { if (str[i] == 'A' || str[i] == 'D' || str[i] == 'K' || str[i] == 'P') { if (word == 0) { save_word = 1; } } if (save_word == 1) buf[buf_size++] = str[i]; if (str[i] == ' ') { word = 0; save_word = 0; } else word = 1; } buf[buf_size] = '\0'; strcpy(str, buf); printf("\nNew string: "); print_str(str); system("PAUSE"); return 0; } Отладка Д ля начала скомпилируем файл main.c командой gcc –gmain2.c –omain2.exe Затем начнем отладку программы при помощи команды gdb main2.exe. В консоль будет выведена информация об отладчике, приведенная на рисунке 2. Рисунок 2 – Информация об отладчике Для отладки поставим точки останова на точках входа и выхода в функции ввода и вывода массива (рисунок 3). Рисунок 3 – точки останова После запуска программы произойдет остановка на 7-ой строчке (вход в функцию ввода строки). Просмотрим содержимое стека командой info args (рисунок 4). Рисунок 4 – содержимое стека при входе в функцию ввода Д алее проверим содержимое стека на следующей точке, выходе из функции ввода (рисунок 5). Рисунок 5 - содержимое стека при выходе из функции ввода Наконец проверим содержимое стека при входе и выходе из функции вывода (рисунок 6, 7). Рисунок 6 - содержимое стека при входе в функцию вывода Рисунок 7 - содержимое стека при выходе из функции вывода Как видно по рисункам, в функцию вывода была передана строка, состоящая из слов начинающихся на буквы «P» и «K», остальные слова были удалены. Задание 3 Дана строка символов до точки. Удалить из нее все сочетания «ас». Исходный код программы main3.c #include #include int main() { char str[50], buf[50]; printf("Enter string: "); read_str(str); int i, buf_size = 0; for (i=0; i { if (str[i] == 'a') { if (i < strlen(str)-1) if (str[i+1] == 'c') { i += 1; continue; } } buf[buf_size++] = str[i]; } buf[buf_size] = '\0'; printf("New string:"); print_str(buf); system("PAUSE"); } Статическаябиблиотека (libio.a) io.h void read_str(char* str); void print_str(char* str); io.c #include void read_str(char* str) { gets(str); } void print_str(char* str) { printf("%s\n", str); } Отладка ля начала скомпилируем файл main.c с использованием статической библиотеки libio.a командой gcc -g -o main3 main3.o -L. –lio. Затем начнем отладку программы при помощи команды gdb main3.exe. Для отладки поставим точки останова на функциях read_str и print_str(места входа в функции) и на 11-ой и 31-ой строчках(места выхода из функций)(рисунок 9). Рисунок 8 – точки останова Далее запустим программу, и после остановки на функции read_arr выведем содержимое стека командой infoargs(рисунок 9). Рисунок 9 – содержимое стека при входе в функцию read_arr Затем программа остановится на выходе из функции read_arr, содержимое стека представлено на рисунке 10. Рисунок 10 - содержимое стека при выходе из функции read_arr Далее просмотрим содержимое стека на входе в функцию print_arr(рисунок 11). Рисунок 11 - содержимое стека при входе в функцию print_arr И наконец, содержимое стека на выходе из функции print_arr представлено на рисунке 12. Р исунок 12 - содержимое стека при выходе из функции print_arr Как видно из рисунков, функция read_arr корректно возвратила прочитанную строку, а в функцию print_arr была передана отредактированная строка с удаленными сочетаниями «ac». |