Вход/Регистрация
Основы программирования в Linux
вернуться

Мэтью Нейл

Шрифт:

(gdb) list

18 /* 18 */ int s = 1;

19 /* 19 */

20 /* 20 */ for(; i < n && s != 0; i++) {

21 /* 21 */ s = 0;

22 /* 22 */ for(j = 0; j < n; j++) {

23 /* 23 */ if(a[j].key > a[j+1].key) {

24 /* 24 */ item t = a[j];

25 /* 25 */ a[j] = a[j+1];

26 /* 26 */ a[j+1] = t;

27 /* 27 */ s++;

(gdb)

В строке 22 задано выполнение цикла до тех пор, пока переменная

j
меньше
n
. В данном случае
n
равна 5, поэтому у
j
будет последнее значение 4, слишком большое. Значение 4 приводит к сравнению
а[4]
с
а[5]
и возможной их перестановке. Единственное решение этой конкретной проблемы — исправить условие завершения цикла на следующее:
j < n-1
.

Давайте внесем это изменение, назовем новую программу debug4.c, откомпилируем ее и попробуем снова выполнить.

/* 22 */ for(j = 0; j < n-1; j++) {

$ cc -g -o debug4 debug4.с

$ ./debug4

array[0] = {john, 2}

array[1] = {alex, 1}

array[2] = {bill, 3}

array[3] = {neil, 4}

array[4] = {rick, 5}

Программа все еще не работает, поскольку она вывела неверно отсортированный список. Попробуем применить gdb для пошагового выполнения программы.

Установка точек останова

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

В функции

sort
есть два цикла. Внешний цикл с переменной цикла
i
выполняется для каждого элемента массива один раз. Внутренний или вложенный цикл меняет местами элемент с последующим, расположенным ниже в списке. Это создает эффект всплытия пузырьков, поднимая вверх меньшие элементы. После каждого выполнения внешнего цикла самый большой элемент опускается на дно. Вы можете убедиться в этом, остановив программу на внешнем цикле и просмотрев состояние массива.

Для установки точек останова применяется ряд команд. Их перечень получен отладчиком gdb с помощью команды

help breakpoint
:

(gdb) help breakpoint

Making program stop at certain points.

List of commands:

awatch -- Set a watchpoint for an expression

break -- Set breakpoint at specified line or function

catch -- Set catchpoints to catch events

clear -- Clear breakpoint at specified line or function

commands -- Set commands to be executed when a breakpoint is hit

condition -- Specify breakpoint number N to break only if COND is true

delete -- Delete some breakpoints or auto-display expressions

delete breakpoints -- Delete some breakpoints or auto-display expressions

delete checkpoint -- Delete a fork/checkpoint (experimental)

delete mem -- Delete memory region

delete tracepoints -- Delete specified tracepoints

disable -- Disable some breakpoints

disable breakpoints -- Disable some breakpoints

disable display -- Disable some expressions to be displayed when program stops

disable mem -- Disable memory region

disable tracepoints -- Disable specified tracepoints

enable -- Enable some breakpoints

enable delete -- Enable breakpoints and delete when hit

enable display -- Enable some expressions to be displayed when program stops

  • Читать дальше
  • 1
  • ...
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: