一种在线调试C/C++程序的方法与流程

文档序号:11803634阅读:811来源:国知局
一种在线调试C/C++程序的方法与流程
:本发明属于软件技术领域,具体涉及一种在线调试C/C++程序的方法。

背景技术:
:传统上,程序员在本地集成开发环境中开发并调试程序。调试客户端和被调试程序都运行在一台机器上。程序员通过设置断点、单步运行、查看变量等操作,查看程序的运行时状态是否与预期相符,从而查找错误,修复程序。随着云计算的兴起,越来越多的程序员开始使用在线集成开发环境,在浏览器中开发程序。使用在线集成开发环境使得程序员可以不受使用的机器性能配置、操作系统的限制,随时随地开发程序,即时把开发的程序同步到服务器上。传统的调试方法在面对这一新场景时,无法应对以下几个挑战:(1)同步问题。在线集成开发环境下,程序的调试动作发生在浏览器端,而调试的程序运行在服务器端,服务器端的调试状态与浏览器端同步存在问题;(2)多用户管理。本地开发环境中,一次调试只有一个用户,不需要进行多用户的管理;但是对于在线开发环境来说,需要并行的支持许多用户同时的调试,动态分配云端资源给多个调试实例,因此不可避免要涉及多用户的管理和资源分配。(3)安全问题。由于用户的程序需要在服务器端运行,如果用户输入恶意程序,将可能使整个系统瘫痪。因此,传统的基于本地集成开发环境的调试方法在在线集成开发环境中运用存在局限,不能满足基于浏览器的在线调试。

技术实现要素:
:针对上述问题,本发明的目的是提供一种基于浏览器的在线程序调试方法。该方法使得程序员能够在在线集成开发环境中发送调试命令、实时获取服务器端调试程序状态、进行控制台输入输出,从而在浏览器中完成程序的调试工作。本发明的技术方案如下:(1)程序员在浏览器端发送“开始调试”的命令,服务器端的控制进程接收到“开始调试”的命令,安全扫描将要运行的程序代码,扫描通过后启动一个以用户名标识的被调试进程。同时启动一个守护线程,监控被调试进程的运行时间。(2)程序员在浏览器端控制台可以输入数据,服务器端的控制进程接收到控制台输入后,导入被调试进程的输入流中。同时,控制进程获取被调试进程的控制台输出。服务器把控制台输出推送到浏览器端,显示给程序员。(3)在调试过程中,程序员可以在浏览器端发送一系列调试命令,包括断点添加、断点删除、单步进入、单步跳出、运行到当前行、继续、查看变量值。控制进程接收到调试命令后,对被调试程序执行调试命令对应的操作。(4)被调试进程实时地把状态信息反馈给控制进程。控制进程解析状态信息文本,推送相应状态到浏览器端。(5)调试结束后,控制进程终止被调试进程,调试结束。上述的在线程序调试方法,所属步骤(1)中,程序员在浏览器端发送“开始调试”命令时,同时附带用户名信息、被调试程序相对地址。控制进程通过上述信息定位被调试程序的绝对地址,启动被调试程序。上述的在线程序调试方法,所属步骤(1)中,当被调试程序运行时间超过设定的阈值时,守护线程终止被调试进程,本次调试结束。上述的在线程序调试方法,所属步骤(3)(4)中,服务器端的控制进程获取被调试进程状态信息和控制台输出后,通过服务器端推送技术(comet),把控制台输出和被调试进程状态信息推送到浏览器端。上述的在线程序调试方法,所属步骤(4)中,服务器端的控制进程获取被调试进程状态信息文本后,通过文本语言的词法分析、语法分析,得到运行状态。运行状态包括:程序当前运行的位置、浏览器端需要查看变量的值。上述的在线程序调试方法,所属步骤(5)中,被调试程序的终止有三种可能:程序运行结束自然终止、用户手动终止调试、运行超时守护进程终止调试。本发明的技术效果在于:本发明的方法保证了在在线集成开发环境中,程序员在浏览器端能够正确的调试程序,保证了浏览器端和服务器端调试状态的一致性;提供了多用户的管理机制;使得程序员在浏览器端能够控制被调试进程的运行过程。附图说明图1表示在本发明中调试的流程。图2表示在本发明中设置断点的示例图3表示在本发明中控制台输入的示例图4表示在本发明中单步调试的示例图5表示在本发明中调试命令“下一行”的示例图6表示在本发明中查看变量值的示例图7表示在本发明中调试结束的示例具体实施方式:附图1示意了一个示例程序的调试流程。启动应用服务器后,自动启动调试的控制进程。这个控制进程负责控制所有用户的被调试进程。首先,用户登录在线开发环境,完成程序的编辑、保存。在程序需要停止的位置设置断点。点击“开始调试”按钮开始调试。浏览器端向服务器端的控制进程发送“调试开始”的命令,控制进程根据用户名和被调试程序地址,启动被调试进程,同时设定最大运行时间,启动守护进程。控制进程启动被调试进程后,返回浏览器端调试开始的信息,浏览器端显示调试正在进行。被调试进程在遇到断点,运行停止。控制进程获得被调试进程的停止信息后,将被调试进程的状态信息,推送到浏览器端。浏览器端显示程序停止在断点处。在浏览器端控制台输入数据。客户端将控制台输入发送给控制进程。控制进程把控制台输入写入被调试进程的输入流上。如果发现被调试进程的输入流已经关闭,则直接返回。浏览器端点击调试命令,比如“单步进入、单步跳过”,发送命令至控制进程。控制进程会对被调试进程发送相关命令操作。浏览器端可以查看当前栈的局部变量,或者具体一个变量的值。控制程序收到查看变量请求后,向被调试进程发送查看变量的命令。被调试进程返回状态结果文本,控制进程解析状态结果文本后得到变量的值,再推送值至浏览器端。被调试进程有控制台输出时,控制进程获取到控制台输出,推送到浏览器端。程序自然终止、用户手动终止或者守护线程超时终止后,控制进程尝试杀掉被调试进程,同时把调试终止的消息推送到浏览器端。其中的关键技术如下:(1)服务器端调试的控制进程控制进程主要由三个模块组成:命令解释器。控制进程从浏览器端接受调试命令,并将命令转化为被调试进程可接受的指令。解释器支持的所有指令如下:操作可接受指令插入断点-break-insert(linenumber)删除断点clear(linenumber)开始运行-exec-run继续运行-exec-continue终止运行-exec-abort单步进入-exec-step单步退出-exec-next查看变量的值-data-evaluate-expression(varname)查看所有当前栈的变量的值-list-locals1状态解析器。被调试进程的状态改变,会输出相应的状态信息文本。这些状态信息以文本的形式被控制进程获取。由于状态种类繁多,状态信息的文本的语法较为复杂,,如果只是运用一般的字符串匹配或者正则表达式匹配,很难正确的得到状态信息。在状态解析器中,对返回的调试状态文本进行语法分析、词法分析,建立语法树,通过遍历语法树,最终获取需要获取的状态信息。控制台输入输出控制器。从浏览器端来的控制台输入,需要控制台输入输出器通过用户名找到客户端对应的被调试进程,在之后对被调试进程导入控制台输入;被调试进程的控制台输出,需要经过控制台输入输出控制器,找到对应的浏览器端,把控制台输出推送至目标浏览器端。同时,控制台输入输出控制器还控制输入输出的长度。超过阈值后,控制台输入输出控制器会终止输入输出流,避免对系统性能造成损害。(1)代码安全检查传统的基于本地集成开发环境的调试,程序员在自己的机器上调试,不存在安全问题。而对于基于在线开发环境的调试,程序员可以在任意编写程序,包括恶意程序。因此,必须对程序的代码做安全检查。在具体实现上,本发明采用黑名单的处理方式。即禁止与操作系统相关函数的使用,包括fork和system两个函数。Fork函数可以在操作系统中新建进程,system函数可以调用操作系统的shell命令。(2)被调试进程死循环、输出溢出的处理方法与传统的本地调试不同的是,在线集成开发环境的调试需要面对多用户的问题。多个用户同时在一个服务器上调试,必须避免他们之间相互影响。对于某些程序无限制死循环,耗尽服务器CPU资源的情况,控制进程会给每个被调试进程指定最大运行时间。一旦超过这个时间,守护进程就会杀死被调试进程,终止调试过程,避免无休止的运行影响其他租户,降低系统开销。最大运行时间的设定参照经验。对于本发明涉及的场景而言,一个程序的一次调试运行时间不会超过5分钟,设为5分钟是个合适的值。对于某些程序大量控制台输出结果,服务器端不得不大量传送控制台输出数据到浏览器端的情况,控制进程会设定控制台输出的上限。一旦超过上限,控制进程停止对被调试进程输出流的获取,让被调试程序忽略控制台输出的情况下继续运行。这样避免了个别调试程序大量占用网络带宽的情况。(2)服务器推送技术传统的Http请求协议的顺序是:浏览器端发出一个HttpRequest,服务器端接受请求后返回HttpResponse。这就要求是浏览器发起一个请求,浏览器端进行响应。对于在线开发环境的调试,服务器端的调试进程会产生状态数据和控制台输出。这些输出需要服务器端推送到浏览器端,这就与传统的Http请求相违背。在本发明中,客户端通过服务器推送技术(Comet),把相关的数据推送到浏览器端。具体说来,一种方法是客户端每隔固定时间去获取服务器端的待推送数据。这样看起来就是服务器能够把数据推送到客户端了,绕过了Http请求协议的顺序。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1