CN107315685A - 一种非侵入式程序实时调试方法 - Google Patents
一种非侵入式程序实时调试方法 Download PDFInfo
- Publication number
- CN107315685A CN107315685A CN201710505356.4A CN201710505356A CN107315685A CN 107315685 A CN107315685 A CN 107315685A CN 201710505356 A CN201710505356 A CN 201710505356A CN 107315685 A CN107315685 A CN 107315685A
- Authority
- CN
- China
- Prior art keywords
- dbg
- address
- breakpoint
- task
- real
- 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.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/366—Software debugging using diagnostics
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明涉及一种非侵入式程序实时调试方法,该方法可以大幅提高程序员的调试效率,尤其对于在客户现场运行的不可中止的大型系统软件;由于该方法在目标程序中植入了DBG Task线程,其可以改变目标程序的代码段机器指令,因此经验丰富的程序员,完全可以对目标程序的缺陷直接进行修改,在提高缺陷定位效率的同时,也大大提高了缺陷修复的手段与效率。
Description
技术领域
本发明涉及一种非侵入式程序实时调试方法。
背景技术
软件程序的实时调试方法与工具非常重要,实施调试远优于事后调试,实时调试能让开发人员在问题发生时定位软件问题,因为调试时间也是软件问题的发生时间,程序现场保存完好,因此比日志分析,Coredump文件分析等方法要更加高效。
“非侵入式”调试方法在很多场景下是唯一选择,很多情况下,要调试实际运行中的大型程序并查找问题,是开发人员的噩梦。因为调试不允许对程序的正常运行造成任何影响;相当一部分软件问题,只有在实际运行现场才能复现。开发人员要实际定位问题,必须确保程序在运行现场按照原有方式运行才能试图分析问题原因并修复。
GDB是使用较多的一款实时调试工具,但是无法满足“非侵入式”的要求。GDB的实现原理是通过ptrace系统调用改变目标线程或进程的运行状态,导致其行为与正常运行线程/进程不同(例如,在Linux系统下,被调试程序收到任何系统新号后都会停止,正常程序则不会),因而无法在实际生产运行的大型软件上使用。
因此,程序员急需一种非侵入式的实时调试方法来解决上述现象,从而保证程序在被调试和正常运行两种状态下的运行行为完全一致。
发明内容
针对上述现有技术的现状,本发明所要解决的技术问题在于提供一种适用于所有系统,可以大幅提高程序员的调试效率,保证程序在被调试和正常运行两种状态下的运行行为完全一致,尤其对于在客户现场运行的不可中止的大型系统软件,同时,能借助植入在目标程序中的DBG Task线程改变目标程序的代码段机器指令,实现对目标程序缺陷的直接修改,在提高缺陷定位效率的同时,大大提高了缺陷修复的手段与效率的非侵入式程序实时调试方法。
本发明解决上述技术问题所采用的技术方案为:一种非侵入式程序实时调试方法,该方法包括:
将DBG Task植入到目标程序中并设置断点;
输入调试命令到DBG Console中;
DBG Console接收程序员的调试命令并通过IP/UDP连接传送到DBG Task;
DBG Task对程序进行调试;
DBG Console通过读取被调试程序的ELF文件,获取各类变量及代码的虚拟内存地址;
DBG Task输出调试命令的结构DBG Logs到计算机。
进一步地,所述DBG Task预先植入到目标程序中,程序员可以实时启动DBGConsole与DBG Task进行调试交互,并通过DBG Logs获取调试结果与输出。
进一步地,所述DBG Task独立于目标程序中的其他线程,在未收到程序员指令的情况下,在整个程序运行过程中不对其他线程及共享数据、代码产生不必要的影响,整个调试过程也不改变目标程序的任何执行状态。
进一步地,所述DBG Task在目标程序中设置断点,包括对于固定机器指令长度的系统(以PowerPC系统为例)设置断点和对于可变机器指令长度的系统(以X86系统为例)设置断点。
进一步地,所述对于固定机器指令长度系统的断点实现方法(以PowerPC系统为例,假设指令长度固定为4Byte)如下:
当程序员在地址X设置断点后,地址X的机器指令被修改为B DBG_BRKPT_XX(跳转到函数DBG_BRKPT_XX);同时,地址X的原机器指令,被保存在函数dbg_bridge_XX中;
DBG_BRKPT_XX,dbg_bridge_XX为实现在DBG Task中的两个全局函数;程序执行到地址X断点后,通过在地址X,DBG_BRKPT_XX,dbg_bridge_XX, 地址X+4几个地址间跳转执行,成功嵌入了标识为红色的调试指令,达到了断点调试的目的。
进一步地,所述可变机器指令长度系统的断点通过软中断的方式实现,以X86系统为例,包括使用INT3指令和Trap Flag两个特殊方法。
进一步地,所述INT3指令是X86系统的一个特殊机器指令,只有1字节长度为0XCC;所述INT3指令就是把相应地址的机器指令修改为0XCC,从而设置了断点;系统执行到所述INT3指令后,会自动触发SIGTRAP软中断处理函数,具体操作方法如下:
INT3触发SIGTRAP处理函数,保存寄存器变量;
执行读取变量等调试命令(dump, copy, etc.);
恢复原地址X的机器指令;
设置EFLAGS以便在地址X的机器指令执行完后再次出发SIGTRAP系统调用重新设置断点;
跳转回地址X,回复寄存器;
由于之前EFLAGS标志位被设置,相应处理函数被触发重新激活断点;
将地址X的机器指令修改为0XCC(INT3)使断点继续存在。
与现有技术相比,本发明的优点在于:本发明提供了一种适用于所有系统的非侵入实时调试算法,可以大幅提高程序员的调试效率,尤其对于在客户现场运行的不可中止的大型系统软件;由于该方法在目标程序中植入了DBG Task线程,其可以改变目标程序的代码段机器指令,因此经验丰富的程序员,完全可以对目标程序的缺陷直接进行修改,在提高缺陷定位效率的同时,也大大提高了缺陷修复的手段与效率。
附图说明
图1为本发明的方法示意图;
图2为本发明中对于固定机器指令长度系统的断点实现方法示意图;
图3为本发明中对于可变机器指令长度系统的断点实现方法示意图。
具体实施方式
如图1~3所示,一种非侵入式程序实时调试方法,该方法包括将DBG Task植入到目标程序中并设置断点、输入调试命令到DBG Console中、DBG Console接收程序员的调试命令并通过IP/UDP连接传送到DBG Task、DBG Task对程序进行调试;DBG Console通过读取被调试程序的ELF文件,获取各类变量及代码的虚拟内存地址;DBG Task输出调试命令的结构DBG Logs到计算机;DBG Task是本方法实现的核心,其预先植入到目标程序中,程序员可以实时启动DBG Console与DBG Task进行调试交互,并通过DBG Logs获取调试结果与输出;DBG Task独立于目标程序中的其他线程,在未收到程序员指令的情况下,在整个程序运行过程中不对其他线程及共享数据、代码产生不必要的影响。整个调试过程也不改变目标程序的任何执行状态,完全实现了非侵入式调试;本方法中的调试过程的关键点,在于在目标程序中设置断点(breakpint)。DBG Task实现断点的机制是改调试算法的核心。不同的计算机系统,机器指令的长度各不相同。对于固定机器指令长度的系统(以PowerPC系统为例)和可变机器指令长度的系统(以X86系统为例),断点的实现机制不同。
如图2所示,固定机器指令长度系统的断点实现方法(以PowerPC系统为例,假设指令长度固定为4Byte)如下:
当程序员在地址X设置断点后,地址X的机器指令被修改为B DBG_BRKPT_XX(跳转到函数DBG_BRKPT_XX)。同时,地址X的原机器指令,被保存在函数dbg_bridge_XX中。
DBG_BRKPT_XX,dbg_bridge_XX为实现在DBG Task中的两个全局函数。程序执行到地址X断点后,通过在地址X,DBG_BRKPT_XX,dbg_bridge_XX, 地址X+4几个地址间跳转执行(步骤1,2,3),成功嵌入了标识为红色的调试指令,达到了断点调试的目的。
可变机器指令长度系统的断点实现相对复杂,因为机器指令大小可变,所述可以通过软中断的方式实现断点机制。以X86系统为例,我们使用INT3指令和Trap Flag两个特殊方法。
INT3指令是X86系统的一个特殊机器指令,只有1字节长度为0XCC;设置断点就是把相应地址的机器指令修改为0XCC;系统执行到INT3指令后,会自动触发SIGTRAP软中断处理函数。
Trap Flag是x86处理器FLAGS寄存器中的一个特殊标志位。当该标志位被设置时,处理器会在下一条指令触发SIGTRAP软中断处理函数。
如图3所示,可变机器指令长度系统的断点实现方法(以X86系统为例)如下:
INT3触发SIGTRAP处理函数,保存寄存器变量;
执行读取变量等调试命令(dump, copy, etc.);
恢复原地址X的机器指令;
设置EFLAGS以便在地址X的机器指令执行完后再次出发SIGTRAP系统调用重新设置断点;
跳转回地址X,回复寄存器;
由于之前EFLAGS标志位被设置,相应处理函数被触发重新激活断点;
将地址X的机器指令修改为0XCC(INT3)使断点继续存在。
本发明提供了一种适用于所有系统的非侵入实时调试算法,可以大幅提高程序员的调试效率,尤其对于在客户现场运行的不可中止的大型系统软件;由于该方法在目标程序中植入了DBG Task线程,其可以改变目标程序的代码段机器指令,因此经验丰富的程序员,完全可以对目标程序的缺陷直接进行修改,在提高缺陷定位效率的同时,也大大提高了缺陷修复的手段与效率。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的技术人员应当理解,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行同等替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神与范围。
Claims (7)
1.一种非侵入式程序实时调试方法,该方法包括:
将DBG Task植入到目标程序中并设置断点;
输入调试命令到DBG Console中;
DBG Console接收程序员的调试命令并通过IP/UDP连接传送到DBG Task;
DBG Task对程序进行调试;
DBG Console通过读取被调试程序的ELF文件,获取各类变量及代码的虚拟内存地址;
DBG Task输出调试命令的结构DBG Logs到计算机。
2. 根据权利要求1所述的一种非侵入式程序实时调试方法,其特征在于,所述DBGTask预先植入到目标程序中,程序员可以实时启动DBG Console与DBG Task进行调试交互,并通过DBG Logs获取调试结果与输出。
3.根据权利要求1所述的一种非侵入式程序实时调试方法,其特征在于,所述DBG Task独立于目标程序中的其他线程,在未收到程序员指令的情况下,在整个程序运行过程中不对其他线程及共享数据、代码产生不必要的影响,整个调试过程也不改变目标程序的任何执行状态。
4.根据权利要求1所述的一种非侵入式程序实时调试方法,其特征在于,所述DBG Task在目标程序中设置断点,包括对于固定机器指令长度的系统(以PowerPC系统为例)设置断点和对于可变机器指令长度的系统(以X86系统为例)设置断点。
5.根据权利要求4所述的一种非侵入式程序实时调试方法,其特征在于,所述对于固定机器指令长度系统的断点实现方法(以PowerPC系统为例,假设指令长度固定为4Byte)如下:
当程序员在地址X设置断点后,地址X的机器指令被修改为B DBG_BRKPT_XX(跳转到函数DBG_BRKPT_XX);同时,地址X的原机器指令,被保存在函数dbg_bridge_XX中;
DBG_BRKPT_XX,dbg_bridge_XX为实现在DBG Task中的两个全局函数;程序执行到地址X断点后,通过在地址X,DBG_BRKPT_XX,dbg_bridge_XX, 地址X+4几个地址间跳转执行,成功嵌入了标识为红色的调试指令,达到了断点调试的目的。
6.根据权利要求4所述的一种非侵入式程序实时调试方法,其特征在于,所述可变机器指令长度系统的断点通过软中断的方式实现,以X86系统为例,包括使用INT3指令和TrapFlag两个特殊方法。
7.根据权利要求6所述的一种非侵入式程序实时调试方法,其特征在于,所述INT3指令是X86系统的一个特殊机器指令,只有1字节长度为0XCC;所述INT3指令就是把相应地址的机器指令修改为0XCC,从而设置了断点;系统执行到所述INT3指令后,会自动触发SIGTRAP软中断处理函数,具体操作方法如下:
INT3触发SIGTRAP处理函数,保存寄存器变量;
执行读取变量等调试命令(dump, copy, etc.);
恢复原地址X的机器指令;
设置EFLAGS以便在地址X的机器指令执行完后再次出发SIGTRAP系统调用重新设置断点;
跳转回地址X,回复寄存器;
由于之前EFLAGS标志位被设置,相应处理函数被触发重新激活断点;
将地址X的机器指令修改为0XCC(INT3)使断点继续存在。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710505356.4A CN107315685A (zh) | 2017-06-28 | 2017-06-28 | 一种非侵入式程序实时调试方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710505356.4A CN107315685A (zh) | 2017-06-28 | 2017-06-28 | 一种非侵入式程序实时调试方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN107315685A true CN107315685A (zh) | 2017-11-03 |
Family
ID=60180429
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710505356.4A Pending CN107315685A (zh) | 2017-06-28 | 2017-06-28 | 一种非侵入式程序实时调试方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107315685A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108319555A (zh) * | 2018-03-17 | 2018-07-24 | 成都大学 | 一种基于嵌入式实时系统的实时调试方法 |
CN113742237A (zh) * | 2021-09-13 | 2021-12-03 | 北京奕斯伟计算技术有限公司 | 程序调试方法、装置、设备以及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1959653A (zh) * | 2005-11-03 | 2007-05-09 | 国际商业机器公司 | 调试计算机程序的装置与方法 |
US20070240125A1 (en) * | 2005-10-14 | 2007-10-11 | Oracle International Corporation | Debugging functionality embedded in an application |
CN101482848A (zh) * | 2009-02-03 | 2009-07-15 | 中兴通讯股份有限公司 | 一种在嵌入式软件运行状态下的动态调试方法及系统 |
CN103595820A (zh) * | 2013-11-28 | 2014-02-19 | 深圳英飞拓科技股份有限公司 | 嵌入式前端设备后台控制调试方法及装置 |
CN105723346A (zh) * | 2013-08-19 | 2016-06-29 | 微软技术许可有限责任公司 | 使用可修改的快照定义来对执行代码拍摄快照 |
-
2017
- 2017-06-28 CN CN201710505356.4A patent/CN107315685A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070240125A1 (en) * | 2005-10-14 | 2007-10-11 | Oracle International Corporation | Debugging functionality embedded in an application |
CN1959653A (zh) * | 2005-11-03 | 2007-05-09 | 国际商业机器公司 | 调试计算机程序的装置与方法 |
CN101482848A (zh) * | 2009-02-03 | 2009-07-15 | 中兴通讯股份有限公司 | 一种在嵌入式软件运行状态下的动态调试方法及系统 |
CN105723346A (zh) * | 2013-08-19 | 2016-06-29 | 微软技术许可有限责任公司 | 使用可修改的快照定义来对执行代码拍摄快照 |
CN103595820A (zh) * | 2013-11-28 | 2014-02-19 | 深圳英飞拓科技股份有限公司 | 嵌入式前端设备后台控制调试方法及装置 |
Non-Patent Citations (2)
Title |
---|
微软公司 等: "《Visual Studio.NET开发环境使用指南》", 31 July 2001, 清华大学出版社 * |
蔡铭 等: "《航天型号高可靠软件系统调试原理与技术》", 31 August 2008, 中国宇航出版社 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108319555A (zh) * | 2018-03-17 | 2018-07-24 | 成都大学 | 一种基于嵌入式实时系统的实时调试方法 |
CN113742237A (zh) * | 2021-09-13 | 2021-12-03 | 北京奕斯伟计算技术有限公司 | 程序调试方法、装置、设备以及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7950001B2 (en) | Method and apparatus for instrumentation in a multiprocessing environment | |
US8806447B2 (en) | Step-type operation processing during debugging by machine instruction stepping concurrent with setting breakpoints | |
TWI544410B (zh) | 利用執行單步驟以進行編碼診斷 | |
JP2005317023A (ja) | データ処理装置のブレークポイント論理ユニット、デバッグ論理、およびブレークポイントの方法 | |
CN105528284A (zh) | 一种内核故障注入方法及电子设备 | |
US20130254747A1 (en) | Method and apparatus for testing programs | |
CN110704314A (zh) | 一种嵌入式软件测试的故障注入方法 | |
CN111367742A (zh) | 调试mvp处理器的方法、装置、终端和计算机可读存储介质 | |
CN110704315B (zh) | 一种嵌入式软件测试的故障注入装置 | |
US8972784B2 (en) | Method and device for testing a system comprising at least a plurality of software units that can be executed simultaneously | |
CN107315685A (zh) | 一种非侵入式程序实时调试方法 | |
US9910760B2 (en) | Method and apparatus for interception of synchronization objects in graphics application programming interfaces for frame debugging | |
US8707267B1 (en) | Debugging a computer program by interrupting program execution in response to access of unused I/O port | |
US20230101154A1 (en) | Resumable instruction generation | |
US11099958B2 (en) | Instruction generation for validation of processor functionality | |
CN103197959B (zh) | 一种多核cpu的切换方法 | |
CN108228239B (zh) | 基于快速模拟器qemu的分支指令抓取方法和装置 | |
KR20190076217A (ko) | 멀티 코어를 이용한 동적 바이너리 인스트루멘테이션 장치 및 방법 | |
Berglund et al. | Method summaries for JPF | |
CN116881120A (zh) | 面向同构非对称多核的OpenOCD单端口调试方法及系统 | |
JPS59183443A (ja) | デバツグ装置 | |
WO2021126526A1 (en) | Architecture agnostic replay verfication | |
WO2018103045A1 (zh) | 测试点的创建方法,装置和系统 | |
JPH05204680A (ja) | 情報処理装置の誤動作防止方式 | |
JPH01177139A (ja) | 命令置換方式 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20171103 |
|
RJ01 | Rejection of invention patent application after publication |