C调试中符号数组的自动导出(教学用)

C调试中符号数组的自动导出(教学用),c,debugging,export,C,Debugging,Export,我需要教孩子们C语言(10-15岁,通过网站进行教学),我希望能够向他们展示一个程序的逐步执行,但我不希望他们直接使用调试器(对他们来说太复杂了,他们完全是初学者) 我的想法是预先计算所有需要的数据并向他们显示(使用一个很酷的javascript动画,代码中的当前行、变量值和标准输出) 我需要的是一种在C代码上运行调试器并在每个可能的步骤(没有结构,只有基本变量和数组)导出变量值的方法 gdb或其他调试器是否有任何接口可以连接到gdb或其他调试器 在某些情况下:我们正在通过一个包含课程、练习(

我需要教孩子们C语言(10-15岁,通过网站进行教学),我希望能够向他们展示一个程序的逐步执行,但我不希望他们直接使用调试器(对他们来说太复杂了,他们完全是初学者)

我的想法是预先计算所有需要的数据并向他们显示(使用一个很酷的javascript动画,代码中的当前行、变量值和标准输出)

我需要的是一种在C代码上运行调试器并在每个可能的步骤(没有结构,只有基本变量和数组)导出变量值的方法

gdb或其他调试器是否有任何接口可以连接到gdb或其他调试器


在某些情况下:我们正在通过一个包含课程、练习(自动更正)的网站为IOI(信息学国际奥林匹克)培训学生。。。 代码(C)可以在线编辑、编译、测试和提交(使用javascript编辑器)。这样一来,一开始就不需要安装任何东西,所以更多的人可以“尝试”

基本的“逐步”调试只是向初学者展示变量是如何修改的,以及“for”或“while”是如何工作的。作为一名教师,你可以在白板上做的事情。更高级的学生将安装一些IDE,并且/或者不使用调试器


因此,对于初学者,我们希望他们能够在网站上使用一些基本代码(矫揉造作、数学运算、函数调用、for、while、if)来“看东西”。

如果您仅限于有特定输入的程序,或者根本没有输入,您可以使用gdb脚本,如下所示:

try.c(输入程序):

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 %d\n", 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 %d\n", 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 %d\n", 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 %d\n", 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 %d\n", 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.
断点1位于0x40053c:文件try.c,第6行。
try.c处的断点1,main():6
6表示(i=0;i<10;i++)
i=0
8 printf(“现在的数字是%d\n”,i);
i=0
现在的数字是0
9i++;
i=0
6表示(i=0;i<10;i++)
i=1
8 printf(“现在的数字是%d\n”,i);
i=2
现在的数字是2
9i++;
i=2
6表示(i=0;i<10;i++)
i=3
8 printf(“现在的数字是%d\n”,i);
i=4
现在的数字是4
9i++;
i=4
6表示(i=0;i<10;i++)
i=5
8 printf(“现在的数字是%d\n”,i);
i=6
现在的数字是6
9i++;
i=6
6表示(i=0;i<10;i++)
i=7
8 printf(“现在的数字是%d\n”,i);
i=8
现在的数字是8
9i++;
i=8
6表示(i=0;i<10;i++)
i=9
11返回0;
i=10
12      }
i=10
0x000000300161ebbd位于/lib/libc.so.6中的
没有可用的符号表信息。
单步执行,直到退出函数_libc_start_main,
它没有行号信息。
程序正常退出。
trace.gdb:6:源命令文件中出现错误:
未选择任何帧。
有很多方法,您可以调整脚本,使输出可解析,从而使其成为javascript可播放的内容


你还需要确保程序不循环地循环,可能是通过限制脚本中的while循环数。

你可能希望考虑使用“预期”。如果做不到这一点,您可能必须使用pty推出自己的解决方案。不过,您可能正在寻找更高级别的解决方案。这是一个好主意,但很难实现。我唯一能想到的就是GDB的某种AJAX接口。谢谢!我想知道有些东西已经存在了,但似乎我必须自己去做。我以后一定会把它开源。
break main
run
while 1
info locals
step
end
quit
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 %d\n", 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 %d\n", 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 %d\n", 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 %d\n", 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 %d\n", 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.