Автоматический экспорт массива символов при отладке C (обучающая цель)

#c #debugging #export

#c #отладка #экспорт

Вопрос:

Мне нужно обучать C детей (10-15 лет, обучение осуществляется через веб-сайт), и я хочу иметь возможность показывать им пошаговое выполнение программы, но я не хочу, чтобы они напрямую использовали отладчик (слишком сложный для них, они полные новички).

Моя идея состояла в том, чтобы предварительно вычислить все необходимые данные и показать их им (с классной анимацией javascript, с текущей строкой в коде, значениями переменных и стандартным выводом).

Что мне нужно, так это способ запуска отладчика в коде C и экспорта значений переменных на каждом возможном шаге (без структуры, только базовые переменные и массивы).

Есть ли какой-либо интерфейс к gdb или какому-либо другому отладчику, который может это сделать?


Для некоторого контекста: мы готовим студентов к IOI (Международной олимпиаде по информатике) через веб-сайт с курсами, упражнениями (автоматически исправленными)… Код (на C) можно редактировать, компилировать, тестировать и отправлять онлайн (с помощью редактора javascript). Таким образом, нет необходимости ничего устанавливать (сначала), чтобы больше людей могли просто «попробовать это».

Основная отладка «шаг за шагом» заключалась только в том, чтобы показать новичкам, как изменяются переменные, как работают «for» или «while». То, что вы можете делать на доске в качестве преподавателя. Более продвинутые учащиеся установят некоторую среду IDE и будут / или не будут использовать отладчик.

Итак, для новичков мы хотим, чтобы они могли поиграть на веб-сайте с некоторым базовым кодом (аффектации, математические операции, вызов функции, for, while, if), чтобы «увидеть вещи».

Комментарии:

1. Возможно, вы захотите рассмотреть возможность использования ‘expect’. В противном случае вам, возможно, придется создать собственное решение с использованием pty. Однако вы, вероятно, ищете решение более высокого уровня.

2. Это хорошая идея, но довольно сложная в реализации. Единственное, что я могу придумать, это какой-то AJAX-интерфейс для GDB.

Ответ №1:

Если вы ограничены программами с определенным вводом или вообще без ввода, возможно, вы можете использовать gdb scripting, что-то вроде этого:

попробуйте.c (программа ввода):

 #include <stdio.h>

int main()
{
        int i;
        for (i = 0; i < 10; i  )
        {
                printf("the number now is %dn", i);
                i  ;
        }
        return 0;
}
  

trace.gdb (базовый скрипт gdb):

 break main
run
while 1
info locals
step
end
quit
  

результаты gdb -x trace.gdb -batch try

 Breakpoint 1 at 0x40053c: file try.c, line 6.

Breakpoint 1, main () at try.c:6
6               for (i = 0; i < 10; i  )
i = 0
8                       printf("the number now is %dn", i);
i = 0
the number now is 0
9                       i  ;
i = 0
6               for (i = 0; i < 10; i  )
i = 1
8                       printf("the number now is %dn", i);
i = 2
the number now is 2
9                       i  ;
i = 2
6               for (i = 0; i < 10; i  )
i = 3
8                       printf("the number now is %dn", i);
i = 4
the number now is 4
9                       i  ;
i = 4
6               for (i = 0; i < 10; i  )
i = 5
8                       printf("the number now is %dn", i);
i = 6
the number now is 6
9                       i  ;
i = 6
6               for (i = 0; i < 10; i  )
i = 7
8                       printf("the number now is %dn", i);
i = 8
the number now is 8
9                       i  ;
i = 8
6               for (i = 0; i < 10; i  )
i = 9
11              return 0;
i = 10
12      }
i = 10
0x000000300161ebbd in __libc_start_main () from /lib/libc.so.6
No symbol table info available.
Single stepping until exit from function __libc_start_main,
which has no line number information.

Program exited normally.
trace.gdb:6: Error in sourced command file:
No frame selected.
  

Есть способы изменить выходные данные gdb, так что, возможно, вы можете настроить скрипт так, чтобы выходные данные можно было анализировать таким образом, чтобы вы могли сделать их воспроизводимыми с помощью javascript.

И вам также нужно убедиться, что программа не выполняет бесконечный цикл, возможно, используя удобные переменные для ограничения количества циклов while в скрипте.

Комментарии:

1. Спасибо! Я предполагал, что что-то уже существует, но, похоже, мне придется сделать это самому. Я обязательно открою его после этого.