CN103473177A - 一种在线调试c/c++程序的方法 - Google Patents

一种在线调试c/c++程序的方法 Download PDF

Info

Publication number
CN103473177A
CN103473177A CN2013104448065A CN201310444806A CN103473177A CN 103473177 A CN103473177 A CN 103473177A CN 2013104448065 A CN2013104448065 A CN 2013104448065A CN 201310444806 A CN201310444806 A CN 201310444806A CN 103473177 A CN103473177 A CN 103473177A
Authority
CN
China
Prior art keywords
debugged
debugging
program
control process
control
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.)
Granted
Application number
CN2013104448065A
Other languages
English (en)
Other versions
CN103473177B (zh
Inventor
张化劲
吴凌
杨楠
王千祥
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Peking University
Original Assignee
Peking University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Peking University filed Critical Peking University
Priority to CN201310444806.5A priority Critical patent/CN103473177B/zh
Priority claimed from CN201310444806.5A external-priority patent/CN103473177B/zh
Publication of CN103473177A publication Critical patent/CN103473177A/zh
Application granted granted Critical
Publication of CN103473177B publication Critical patent/CN103473177B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种在线调试C/C++程序的方法。该方法包括步骤:1.启动调试,在服务器端启动以用户名标识的被调试进程,启动守护线程;2.在浏览器端控制台可以输入数据,服务器端的控制进程接收到控制台输入后,导入被调试进程的输入流中。同时,控制进程获取被调试进程的控制台输出。服务器把控制台输出推送到浏览器端;3.可以在浏览器端发送一系列调试命令,包括断点添加、断点删除、单步进入、单步跳出、运行到当前行、继续、查看变量值。控制进程接收到调试命令后,对被调试程序执行调试命令对应的操作;4.被调试进程实时地把状态信息反馈给控制进程。控制进程解析状态信息文本,推送相应状态到浏览器端;5.调试结束后,控制进程终止被调试进程,调试结束。采用本发明的方法,可以在浏览器上实现对程序的在线调试。

Description

一种在线调试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(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)中,服务器端的控制进程获取被调试进程状态信息文本后,通过文本语言的词法分析、语法分析解析状态信息文本,得到运行状态。运行状态包括:程序当前运行的位置、浏览器端需要查看变量的值。
CN201310444806.5A 2013-09-25 一种在线调试c/c++程序的方法 Expired - Fee Related CN103473177B (zh)

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 true CN103473177A (zh) 2013-12-25
CN103473177B CN103473177B (zh) 2016-11-30

Family

ID=

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106406973A (zh) * 2016-11-17 2017-02-15 杭州华恩教育科技有限公司 一种动态编译运行外部代码的***及其方法
CN111464333A (zh) * 2020-03-06 2020-07-28 浙江大华技术股份有限公司 远程调试方法、计算机设备、存储装置和远程调试***
CN111984537A (zh) * 2020-08-24 2020-11-24 上海睿成软件有限公司 一种基于WebIDE的软件测试方法、存储介质、装置
WO2021047585A1 (zh) * 2019-09-12 2021-03-18 安徽寒武纪信息科技有限公司 程序调试方法、装置、调试工具和计算机设备
CN114968751A (zh) * 2021-02-24 2022-08-30 中国联合网络通信集团有限公司 一种无代码开发平台的程序调试方法和程序调试装置

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102270125A (zh) * 2010-06-04 2011-12-07 中兴通讯股份有限公司 Web应用的开发装置及其开发方法
US20120246610A1 (en) * 2011-03-23 2012-09-27 Infosys Technologies Ltd. Online integrated development environment with code assist

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102270125A (zh) * 2010-06-04 2011-12-07 中兴通讯股份有限公司 Web应用的开发装置及其开发方法
US20120246610A1 (en) * 2011-03-23 2012-09-27 Infosys Technologies Ltd. Online integrated development environment with code assist

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
PKUMASS团队: "云时代的集成开发环境", 《中国教育网络》 *
吴凌等: "CEclipse:一个基于服务组合的在线集成开发环境", 《计算机研究与发展》 *
朱松盛: "可在线编程的多功能单片机实验板", 《南京师范大学学报(工程技术版)》 *

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106406973A (zh) * 2016-11-17 2017-02-15 杭州华恩教育科技有限公司 一种动态编译运行外部代码的***及其方法
WO2021047585A1 (zh) * 2019-09-12 2021-03-18 安徽寒武纪信息科技有限公司 程序调试方法、装置、调试工具和计算机设备
CN111464333A (zh) * 2020-03-06 2020-07-28 浙江大华技术股份有限公司 远程调试方法、计算机设备、存储装置和远程调试***
CN111984537A (zh) * 2020-08-24 2020-11-24 上海睿成软件有限公司 一种基于WebIDE的软件测试方法、存储介质、装置
CN111984537B (zh) * 2020-08-24 2021-12-07 上海睿成软件有限公司 一种基于WebIDE的软件测试方法、存储介质、装置
CN114968751A (zh) * 2021-02-24 2022-08-30 中国联合网络通信集团有限公司 一种无代码开发平台的程序调试方法和程序调试装置

Similar Documents

Publication Publication Date Title
CN102789413B (zh) 一种并行程序的调试***及方法
CA2915620C (en) Method and apparatus for code virtualization and remote process call generation
CN112187585B (zh) 网络协议测试方法及装置
US9720753B2 (en) CloudSeer: using logs to detect errors in the cloud infrastructure
US10185644B2 (en) Service implementation based debugger for service oriented architecture projects
CN101727316B (zh) 适于集群***的并行程序集成开发***及其应用实现方法
CN104281520A (zh) 跟踪和调试的方法、装置及***
CN109408763B (zh) 一种对不同模板的简历进行管理的方法及***
CN102087577A (zh) 与位置无关地执行用户接口操作
CN103729292A (zh) 一种跨主机、跨平台的远程命令调用方法和***
CN102609472A (zh) 进行分布式数据库***性能测试的方法及***
CN113051514A (zh) 元素的定位方法、装置、电子设备及存储介质
CN111367802B (zh) web自动化测试方法、装置及计算机可读存储介质
CN105630665A (zh) 一种基于安卓***的应用程序调试方法及终端设备
CN105955838A (zh) 一种***死机的原因查看方法及装置
CN103324567A (zh) 一种应用引擎的调试方法和调试***
CN102750143A (zh) 基于matlab com组件调用的dsp开发方法
CN114253798A (zh) 指标数据采集方法和装置、电子设备、存储介质
CN112667795A (zh) 对话树构建方法和装置、对话树运行方法、装置以及***
Ciobanu et al. Automatic analysis of TiMo systems in PAT
CN103473177A (zh) 一种在线调试c/c++程序的方法
CN103473177B (zh) 一种在线调试c/c++程序的方法
CN108228448B (zh) 一种代码跟踪方法及装置
CN103164776B (zh) 一种药品追溯***及其药品追溯方法和流程监控方法
CN106649118B (zh) 一种基于AST的Java代码SSA单路径的生成方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20161130

Termination date: 20170925