onlinegdb是一款提供在线编辑/编译和调试工具,即无需在本地安装任何软件。便使得程序员可以在任何有网络连接的地方(浏览器)进行代码的编写/编译和调试。
- 在线编译和调试:onlinegdb支持多种编程语言的在线编译和调试,包括C/C++/Java/Python等。程序员可以在线编写代码,并立即进行编译和调试。
- 丰富的调试功能:onlinegdb提供了丰富的调试功能,如设置断点、单步执行、查看变量值等。
- 易于使用和协作:onlinegdb的界面友好,易于使用。同时,它还支持将调试会话分享为链接,方便程序员与他人协作和讨论。
今天就给大家详细演示一个多文件组织结构 形式在onlineGDB上进行编辑/编译/运行/调试的过程。
1.编写

左侧边栏可以通过Create New Project 来创建项目,比如我目前的项目名:Project_C00
右上角可以选择语言。
中间绿色run 按钮的左侧有个灰色文件按钮,它可以创建单个源文件/头文件/Makefile文件/*.input文件等等。(项目自带的main.c可以忽略不用:把其中的main()函数注释掉即可)
实际上,大部分人使用onlineGDB可能就是为了运行一个单个的(一个包含main的源文件)、相对简单的程序,此时使用它默认提供的main.c就可以,编写完成后,点击中间绿色run按钮就可以运行了。本文的宗旨是,测试是否能在onlineGDB 上以终端的形式,编译和运行多文件组织结构项目,并进行调试。
2.编译和运行
如果主过程unit_utilities.c 内容比较简单,绿色run 按钮就可以了。正常情况下,浏览器下方黑色窗口里会有输出。
如果想使用Makefile进行编译和运行的话:

<1>先点击绿色run 按钮右侧的Debug按钮
<2>然后在屏幕下方的Debug Console 窗口里
(gdb) shell make clean
(gdb) shell make unit_utilities
即使用 Debug 控制台执行终端指令,因为大部分同学反应OnlineGDB的界面上根本没有提供 ,它的使用指南上提供的shell按钮 ,那么就只能退而求其次,在gdb模式下执行外部shell命令了。
之后就可以像在线下的终端一样,使用:
./unit_utilities 0
./unit_utilities 1
./unit_utilities 2
......
来测试所有在unit_utilites.c里的测试点了
3.调试
很多同学反应,进入调试状态前,无法在代码行号边栏通过点击加载断点。
那么一个可以替代的操作如下:
<1>项目代码完成后,先点击run按钮右侧的debug按钮
<2>进入debuge 状态后,在界面下侧,gdb窗口内,手动通过指令加载断点。

如上图所示,添加断点的指令:break 130 //在unit_utilities.c 代码的130行添加断点
然后通过run 指令或者 next 代替一些界面上的按钮操作(还是需要你比较熟悉gdb 的一些常用指令 )。
跑过几次后,你会发现之前一些不可以点击使用的按钮也都好用了。
屏幕的右侧就是观察变量的窗口。
常见的指令如下
- (gdb) file ./a.out # 加载程序
- (gdb) break 130 # 设置断点
- (gdb) run # 运行
- (gdb) set args 5 # 给 main(int argc, char *argv[]) 传参
4.几个小疑问
- 为什么之前点不了断点?
在线调试器(比如你用的 GDB Online)通常依赖一个后台服务来"监听"你的点击。如果这个服务还没有完全初始化,或者页面刚加载完时某些组件还没准备好,你点击行号,它可能根本没反应。这种情况在刚打开页面时尤其容易发生。
- 为什么用了 shell make 之后就好了?
你通过 Debug Console 输入 shell make,这个过程其实做了两件很重要的事:
激活了调试环境:你的操作让 GDB 真正"跑起来"了,它需要加载程序、解析符号,这个过程会强制唤醒整个调试后端服务。
刷新了前端状态:GDB 在运行后,会向网页前端(就是你看到的界面)发送很多状态信息,告诉它"我准备好了,程序在哪,哪些行可以设置断点"。网页收到这些信息后,行号边栏的点击功能就变得"可用"了。
简单来说,调试环境需要被"激活"一次,前端界面才能真正工作。你通过命令行让 GDB 跑了一遍,等于是帮界面完成了这个"激活"过程。退出后,界面组件已经处于可用状态,所以再点击就没问题了。
- 以后遇到这种情况怎么办?
下次如果再遇到刚打开页面点不了断点的情况,可以试试这个顺序:
不用急着点断点。
直接 点击 "Debug" 按钮(或者像你一样,在 Debug Console 里随便执行一个 GDB 命令,比如 file ./a.out 或 break main)。
等程序在 main 函数停下来后,退出调试。
这时候再去点击行号,应该就可以正常设置断点了。