CN103473177B - 一种在线调试c/c++程序的方法 - Google Patents
一种在线调试c/c++程序的方法 Download PDFInfo
- Publication number
- CN103473177B CN103473177B CN201310444806.5A CN201310444806A CN103473177B CN 103473177 B CN103473177 B CN 103473177B CN 201310444806 A CN201310444806 A CN 201310444806A CN 103473177 B CN103473177 B CN 103473177B
- Authority
- CN
- China
- Prior art keywords
- debugged
- debugging
- program
- control
- browser
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 claims abstract description 100
- 230000000875 corresponding Effects 0.000 claims abstract description 8
- 238000004458 analytical method Methods 0.000 claims description 6
- 238000005516 engineering process Methods 0.000 claims description 6
- 241001067407 Cometes Species 0.000 claims description 3
- 230000000877 morphologic Effects 0.000 claims description 3
- 230000001276 controlling effect Effects 0.000 description 3
- 238000007689 inspection Methods 0.000 description 2
- 206010033799 Paralysis Diseases 0.000 description 1
- 238000005314 correlation function Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000014509 gene expression Effects 0.000 description 1
- 230000000977 initiatory Effects 0.000 description 1
- 238000004321 preservation Methods 0.000 description 1
- 238000003672 processing method Methods 0.000 description 1
Abstract
本发明公开了一种在线调试C/C++程序的方法。该方法包括步骤:1.启动调试,在服务器端启动以用户名标识的被调试进程,启动守护线程;2.在浏览器端控制台可以输入数据,服务器端的控制进程接收到控制台输入后,导入被调试进程的输入流中。同时,控制进程获取被调试进程的控制台输出。服务器把控制台输出推送到浏览器端;3.可以在浏览器端发送一系列调试命令,包括断点添加、断点删除、单步进入、单步跳出、运行到当前行、继续、查看变量值。控制进程接收到调试命令后,对被调试程序执行调试命令对应的操作;4.被调试进程实时地把状态信息反馈给控制进程。控制进程解析状态信息文本,推送相应状态到浏览器端;5.调试结束后,控制进程终止被调试进程,调试结束。采用本发明的方法,可以在浏览器上实现对程序的在线调试。
Description
技术领域:
本发明属于软件技术领域,具体涉及一种在线调试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(line number) |
删除断点 | clear(line number) |
开始运行 | -exec-run |
继续运行 | -exec-continue |
终止运行 | -exec-abort |
单步进入 | -exec-step |
单步退出 | -exec-next |
查看变量的值 | -data-evaluate-expression(var name) |
查看所有当前栈的变量的值 | -list-locals1 |
状态解析器。被调试进程的状态改变,会输出相应的状态信息文本。这些状态信息以文本的形式被控制进程获取。由于状态种类繁多,状态信息的文本的语法较为复杂,,如果只是运用一般的字符串匹配或者正则表达式匹配,很难正确的得到状态信息。在状态解析器中,对返回的调试状态文本进行语法分析、词法分析,建立语法树,通过遍历语法树,最终获取需要获取的状态信息。
控制台输入输出控制器。从浏览器端来的控制台输入,需要控制台输入输出器通过用户名找到客户端对应的被调试进程,在之后对被调试进程导入控制台 输入;被调试进程的控制台输出,需要经过控制台输入输出控制器,找到对应的浏览器端,把控制台输出推送至目标浏览器端。同时,控制台输入输出控制器还控制输入输出的长度。超过阈值后,控制台输入输出控制器会终止输入输出流,避免对***性能造成损害。
(1)代码安全检查
传统的基于本地集成开发环境的调试,程序员在自己的机器上调试,不存在安全问题。而对于基于在线开发环境的调试,程序员可以在任意编写程序,包括恶意程序。因此,必须对程序的代码做安全检查。
在具体实现上,本发明采用黑名单的处理方式。即禁止与操作***相关函数的使用,包括fork和system两个函数。Fork函数可以在操作***中新建进程,system函数可以调用操作***的shell命令。
(2)被调试进程死循环、输出溢出的处理方法
与传统的本地调试不同的是,在线集成开发环境的调试需要面对多用户的问题。多个用户同时在一个服务器上调试,必须避免他们之间相互影响。
对于某些程序无限制死循环,耗尽服务器CPU资源的情况,控制进程会给每个被调试进程指定最大运行时间。一旦超过这个时间,守护进程就会杀死被调试进程,终止调试过程,避免无休止的运行影响其他租户,降低***开销。最大运行时间的设定参照经验。对于本发明涉及的场景而言,一个程序的一次调试运行时间不会超过5分钟,设为5分钟是个合适的值。
对于某些程序大量控制台输出结果,服务器端不得不大量传送控制台输出数据到浏览器端的情况,控制进程会设定控制台输出的上限。一旦超过上限,控制进程停止对被调试进程输出流的获取,让被调试程序忽略控制台输出的情况下继续运行。这样避免了个别调试程序大量占用网络带宽的情况。
(2)服务器推送技术
传统的Http请求协议的顺序是:浏览器端发出一个Http Request,服务器端接受请求后返回Http Response。这就要求是浏览器发起一个请求,浏览器端进行响应。
对于在线开发环境的调试,服务器端的调试进程会产生状态数据和控制台输 出。这些输出需要服务器端推送到浏览器端,这就与传统的Http请求相违背。
在本发明中,客户端通过服务器推送技术(Comet),把相关的数据推送到浏览器端。具体说来,一种方法是客户端每隔固定时间去获取服务器端的待推送数据。这样看起来就是服务器能够把数据推送到客户端了,绕过了Http请求协议的顺序。
Claims (5)
1.一种在线调试C/C++程序的方法,在浏览器上调试后台服务器中的程序,其特征在于,包括如下步骤:
(1)程序员在浏览器端发送“开始调试”的命令,服务器端的控制进程接收到“开始调试”的命令,安全扫描将要运行的程序代码,扫描通过后启动一个以用户名标识的被调试进程;同时启动一个守护线程,监控被调试进程的运行时间;
(2)程序员在浏览器端控制台可以输入数据,服务器端的控制进程接收到控制台输入后,导入被调试进程的输入流中;同时,控制进程获取被调试进程的控制台输出。服务器把控制台输出推送到浏览器端,显示给程序员;
(3)在调试过程中,程序员可以在浏览器端发送一系列调试命令,包括断点添加、断点删除、单步进入、单步跳出、运行到当前行、继续、查看变量值。控制进程接收到调试命令后,对被调试程序执行调试命令对应的操作;
(4)被调试进程实时地把状态信息反馈给控制进程,控制进程解析状态信息文本,推送相应状态到浏览器端;
(5)调试结束后,控制进程终止被调试进程,调试结束。
2.如权利要求1所述的在线调试C/C++程序的方法,其特征在于,所属步骤(1)中,程序员在浏览器端发送“开始调试”命令时,同时附带用户名信息、被调试程序相对地址,控制进程通过上述信息定位被调试程序的绝对地址,启动被调试程序。
3.如权利要求1所述的在线调试C/C++程序的方法,其特征在于,所属步骤(1)中,当被调试程序运行时间超过设定的阈值时,守护线程终止被调试进程,本次调试结束。
4.如权利要求1所述的在线调试C/C++程序的方法,其特征在于,所属步骤(3)(4)中,服务器端的控制进程获取被调试进程状态信息和控制台输出后,通过服务器端推送技术(comet),把控制台输出和被调试进程状态信息推送到浏览器端。
5.如权利要求1所述的在线调试C/C++程序的方法,其特征在于,所属步骤(4)中,服务器端的控制进程获取被调试进程状态信息文本后,通过文本语言的词法分析、语法分析解析状态信息文本,得到运行状态,运行状态包括:程序当前运行的位置、浏览器端需要查看变量的值。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310444806.5A CN103473177B (zh) | 2013-09-25 | 一种在线调试c/c++程序的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310444806.5A CN103473177B (zh) | 2013-09-25 | 一种在线调试c/c++程序的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103473177A CN103473177A (zh) | 2013-12-25 |
CN103473177B true CN103473177B (zh) | 2016-11-30 |
Family
ID=
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102270125A (zh) * | 2010-06-04 | 2011-12-07 | 中兴通讯股份有限公司 | Web应用的开发装置及其开发方法 |
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102270125A (zh) * | 2010-06-04 | 2011-12-07 | 中兴通讯股份有限公司 | Web应用的开发装置及其开发方法 |
Non-Patent Citations (3)
Title |
---|
CEclipse:一个基于服务组合的在线集成开发环境;吴凌等;《计算机研究与发展》;20130812;第1324-1333页 * |
云时代的集成开发环境;PKUMASS团队;《中国教育网络》;20120421;第43-45页 * |
可在线编程的多功能单片机实验板;朱松盛;《南京师范大学学报(工程技术版)》;20060630;第6卷(第2期);第42-45页 * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9426177B2 (en) | Method and apparatus for detecting security vulnerability for animation source file | |
CA2915620C (en) | Method and apparatus for code virtualization and remote process call generation | |
US20190163524A1 (en) | Method and apparatus for processing task in smart device | |
CN106503563B (zh) | 基于通用框架的批量漏洞检测方法 | |
US9223570B2 (en) | Migration assistance using compiler metadata | |
US10185644B2 (en) | Service implementation based debugger for service oriented architecture projects | |
WO2016004657A1 (zh) | 一种针对嵌入式软件的测试用例自动化生成装置及其方法 | |
CN105373478B (zh) | 自动化测试方法和*** | |
CN112988599B (zh) | 一种页面调试方法、装置、电子设备和存储介质 | |
CN111831538A (zh) | 调试方法、装置以及存储介质 | |
CN111198813A (zh) | 一种接口测试方法和装置 | |
US20130211545A1 (en) | Embedded Multi-Processor Parallel Processing System and Operating Method for Same | |
CN103729292A (zh) | 一种跨主机、跨平台的远程命令调用方法和*** | |
CN102609472A (zh) | 进行分布式数据库***性能测试的方法及*** | |
CN107911251A (zh) | 一种网络设备配置方法、装置和介质 | |
CN105630665A (zh) | 一种基于安卓***的应用程序调试方法及终端设备 | |
CN103324567B (zh) | 一种应用引擎的调试方法和调试*** | |
CN102750143A (zh) | 基于matlab com组件调用的dsp开发方法 | |
CN105095070B (zh) | 基于浏览器测试组件的qq群数据获取方法与*** | |
Haenisch | A case study on using functional programming for internet of things applications | |
CN103473177B (zh) | 一种在线调试c/c++程序的方法 | |
CN105700934A (zh) | 一种智能编译方法和智能编译*** | |
Liu et al. | Extracting sent message formats from executables using backward slicing | |
Ciobanu et al. | Automatic analysis of TiMo systems in PAT | |
CN106649118B (zh) | 一种基于AST的Java代码SSA单路径的生成方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20161130 Termination date: 20170925 |