Главная страница
Навигация по странице:

  • Лабораторная работа №2

  • Задание к лабораторной работе Часть I

  • Задание 1 1. С клавиатуры вводится последовательность натуральных чисел, признак окончания ввода – ввод нуля. Найти все числа, оканчивающиеся на 7.Исходный код программы

  • Задание 2 Дана строка символов до точки. Оставить в ней только слова, начинающиеся на буквы «A», «D», «K», «P».Исходный код программы

  • Задание 3 Дана строка символов до точки. Удалить из нее все сочетания «ас».Исходный код программы

  • Особенности использования отладчика GDB. лаб 2. Особенности использования отладчика gdb


    Скачать 264.45 Kb.
    НазваниеОсобенности использования отладчика gdb
    АнкорОсобенности использования отладчика GDB
    Дата09.03.2022
    Размер264.45 Kb.
    Формат файлаdocx
    Имя файлалаб 2.docx
    ТипЛабораторная работа
    #388907

    Балтийский государственный технический университет
    «ВОЕНМЕХ» им. Д. Ф. Устинова

    Кафедра О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 командой gccgmain1.comain1.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 командой gccgmain2.comain2.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».


    написать администратору сайта