#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. Спасибо! Я предполагал, что что-то уже существует, но, похоже, мне придется сделать это самому. Я обязательно открою его после этого.