CN102262587B - 一种断点调试方法和调试器 - Google Patents
一种断点调试方法和调试器 Download PDFInfo
- Publication number
- CN102262587B CN102262587B CN201110207453.8A CN201110207453A CN102262587B CN 102262587 B CN102262587 B CN 102262587B CN 201110207453 A CN201110207453 A CN 201110207453A CN 102262587 B CN102262587 B CN 102262587B
- Authority
- CN
- China
- Prior art keywords
- breakpoint
- conditional
- debugger
- function
- information
- 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
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明涉及一种断点调试方法和调试器。所述断点调试方法包括以下步骤:接收调试中的断点信息;将所述断点信息组合成断点函数并输出;加载动态链接库,所述动态链接库由所述断点函数进行编译生成。所述调试器包括:接收单元,用于接收调试中的断点信息;输出单元,用于将所述断点信息组合成断点函数并输出;加载单元,用于加载动态链接库。根据本发明的调试方法和调试器,可以大幅提升调试器的执行效率。
Description
技术领域
本发明涉及计算机软件设计,尤其涉及一种断点调试方法和调试器。
背景技术
调试器是处理器体系结构设计与软硬件协同验证中不可或缺的一部分。一方面,它在软件层次上对目标处理器的体系结构进行建模来模拟其执行行为,另一方面,通过提供调试接口,接收用户输入的各种控制信息,实现对程序执行过程中的数据流、控制流的监测及修改。
调试器最基础、最核心的功能之一是断点功能,它可以让程序中断在需要的地方,从而方便其分析。断点又可以分为行断点和条件断点两种,且以用户输入的条件断点为主。
现有技术的调试器一般采用表达式计算来实现条件断点的解析,而表达式计算一般采用如下两种方案进行处理:
第一种方案:其于栈结构的表达式计算,以后缀表达式a+b*c>(d*e+f)*g为例,首先将后缀表达式利用栈操作生成中缀表达式abc*+de*f+g*>,按a,b,c*,+,d,e,*,f,+,g,*,>的顺序依次压栈,在压栈过程中,遇到有效操作符的时候,按照操作符所需要操作数的个数,从栈中弹出相应个数,计算后将结果再次压入栈中。例如,当压入操作符*的时候,需要将操作数c和b依次弹出栈,并计算b*c后将结果再压入到栈中。具体过程如图1所示。
第二种方案:基于语义二叉树结构的表达式计算,按字符的优先级组织成二叉树结构,计算时应用深度优先搜索算法从二叉树的底层从左至右,从下至上依次进行计算。以第一种方案中的后缀表达式为例,处理的二叉树结构如图2所示。
现有技术上述两种方案存在的缺点是只能处理有限的固定模式,应用面窄,当通过调试接口输入条件断点信息时,繁琐的表达式计算会严重影响调试器的执行效率,严重影响调试器性能。
发明内容
本发明的目的是提供一种执行效率高且稳定可靠的断点调试方法和调试器,来解决断点信息中繁琐的表达式计算问题,从而大幅提高了调试器的执行效率。
为实现上述目的,本发明提供了一种断点调试方法,其特征在于包括以下步骤:
接收调试中的断点信息;
将所述断点信息组合成断点函数并输出;
加载动态链接库,所述动态链接库由所述断点函数进行编译生成。
本发明还提供了一种调试器,其特征在于包括:
接收单元,用于接收调试中的断点信息;
输出单元,用于将所述断点信息组合成断点函数并输出;
加载单元,用于加载所述动态链接库。
本发明实施例的断点调试方法和调试器,通过将调试器接收的断点信息组合成函数并进行编译,生成供调试器加载调用,并执行的动态链接库中的函数,解决了调试器处理繁琐的条件断点表达式时遇到的执行效率低下问题,从而大幅提升调试器的执行效率。
附图说明
图1为现有技术的基于栈结构的表达式计算;
图2为现有技术的基于语义二叉树结构的表达式计算;
图3为本发明一实施例的断点调试方法流程图;
图4为本发明一实施例的调试器示意结构图;
图5示意性示出了一种断点调试方法的处理系统。
具体实施方式
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
图3为本发明一实施例的断点调试方法流程图。
在步骤301,接收调试中的断点信息。
调试器在调试中接收来自用户设置的断点信息,例如,用户设置的条件断点信息。调试器将所有在调试中接收到的断点信息存储在断点缓冲器中。
在步骤302,对所述断点信息组合成断点函数并输出。
调试器在接收断点信息完成后,将存储在断点缓冲器中的断点信息组合成断点函数并输出。
在一个实施例中,调试器将存储在断点缓冲器中的全部条件断点信息和需要变量进程地址组合成断点函数并输出,上述输出可以是输出到C语言文件中。
输出的C语言文件的组织形式如下:
#define variable process_address
…
_declspec(dllexport)int_stdcall breakpoints_test(void)
{
if(breakpint_expression_1)
return1;
if(breakpint_expression_1)
return2;
…
if(breakpint_expression_n)
return n;
}
其中各条件断点由if语句包装,在c语言级别上,当其中某一条件断点满足时,则返回相应的条件断点编号,调试器暂停执行。
例如,上述语句“breakpint_expression_1”为条件断点表达式,其条件断点编号为1,语句“return 1”为返回编号为1的条件断点。当条件断点表达式1满足条件时,则返回到编号为1的条件断点处,调试器暂停执行。
在步骤303,对所述断点函数进行编译,生成动态链接库。
当C语言文件输出成功后,调试器调用第三方编译器将步骤302中输出的C语言文件进行编译、汇编和链接,最后形成动态链接库(DLL)。
在一个实施例中,调试器调用C语言编译器对输出的C语言文件进行编译、汇编和链接,形成DLL。
在步骤304,加载所述动态链接库。
调试器加载在步骤303中形成的动态链接库,加载后的动态链接库可供调试器调用,调试器在对断点的判断时可直接调用函数breakpoints_test()。
调试器在加载目标动态链接库后,该动态链接库和调试器将共享同一段进程空间,而对断点条件判断执行中的各变量均可归结到从固定地址取固定长度的数据进行处理。以条件断点insncounter>=10为例,相应的声明代码如下所示:
#define address_register_fille[0]*(unsigned long*)0x008a3138
#define data_register_fille[0]*(unsigned long*)0x009a3138
…
#define insncounter*(_ _int64*)0x010a3138
上述声明代码中,条件断点insncounter>=10的有符号变量insncounter在进程空间中的地址为0x010a3138,因此条件断点insncounter>=10直接等价于*(_ _int64*)0x010a3138>=10。
图4为本发明一实施例的调试器示意结构图。如图所示:40表示调试器,41表示接收单元,42表示存储单元,43表示输出单元,44表示加载单元,45表示执行单元,以及46表示断点缓冲器。
接收单元41用于接收调试中的断点信息。
存储单元42用于存储在调试中接收到的断点信息。
输出单元43用于将所述断点信息组合成断点函数并输出。
加载单元44用于加载动态链接库。
调试器40的接收单元41接收来自用户设置的断点信息,例如,用户设置的条件断点信息。调试器40将所有在调试中接收到的断点信息通过存储单元42存储在断点缓冲器46中。在调试器40接收断点信息完成后,将存储在断点缓冲器46中的断点信息组合成断点函数并通过输出单元43输出。其中,调试器40将断点缓冲器46中的条件断点信息组合成断点函数并输出到C语言文件中,另外,将断点缓冲器46中的条件断点信息组合成断点函数并输出到C语言文件中的同时将所需要变量进程地址也一起输出到C语言文件中。通过C语言编译器对C语言文件进行编译、汇编和链接后形成的动态链接库(DLL)由调试器40的加载单元44进行加载,加载后的动态链接库可供调试器40的执行单元45进行调用并判断执行。
由此可以看出,本发明实施例的断点调试方法和调试器采用第三方编译器对条件断点的函数进行编译,并在经汇编和链接后生成动态链接库的方式来解决断点信息中繁琐的表达式计算问题,从而大幅提高了调试器的执行效率。
图5示意性示出了一种断点调试方法的处理系统。图3中所示的断点调试方法可以在该系统中实现。图5中所示的处理系统包括CPU(中央处理器)501,RAM(随机存取器)502,ROM(只读存储器)503,系统总线504,硬盘控制器505,鼠标控制器506,键盘控制器507,显示器控制器508,硬盘509,鼠标510,键盘512,显示器513。在这些部件中,与系统总线504相连的有CPU501、RAM502、ROM503、硬盘控制器505,鼠标控制器506,键盘控制器507和显示器控制器508。硬盘509与硬盘控制器505相连,鼠标510与鼠标控制器506相连,键盘512与键盘控制器507相连,以及显示器513与显示器控制器508相连。
图5中每个部件的功能在本技术领域内都是众所周知的,并且图5所示的结构也是常规的。通常作为软件存储在硬盘509中的计算机可读指令控制。在图3中所示的流程图的基础上,对于一个技术领域内熟练的技术人员无需创造性的工作即可开发出一个或更多的软件,这样开发出的软件将执行图3所示的断点调试方法。
专业人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (6)
1.一种断点调试方法,其特征在于,所述方法包括:
接收调试中的断点信息,所述断点信息为条件断点信息;
将所述条件断点信息组合成断点函数,并以C语言文件输出,其中条件断点由条件语句包装,当其中一条条件断点满足条件时,返回相应的条件断点编号,调试器暂停执行;
调用第三方编译器,所述第三方编译器包括C语言编译器,将输出的所述C语言文件进行编译、汇编和链接,形成动态链接库;
加载动态链接库,并调用所述C语言文件中的断点函数,完成所述条件断点的加载;
所述动态链接库被加载后,该动态链接库和调试器共享同一段进程空间,而对所述条件断点判断执行中的各变量可归结到从固定地址取固定长度的数据进行处理。
2.根据权利要求1所述的方法,其特征在于:所述接收调试中的断点信息步骤后还包括将接收的断点信息存储在断点缓冲器中。
3.根据权利要求1所述的方法,其特征在于:将所述条件断点信息组合成断点函数并输出步骤还包括将变量进程地址和所述断点函数一起输出。
4.一种断点调试装置,其特征在于,所述装置包括:
接收单元,用于接收调试中的断点信息,所述断点信息为条件断点信息;
输出单元,用于将所述条件断点信息组合成断点函数,并以C语言文件输出,其中条件断点由条件语句包装,当其中一条条件断点满足条件时,返回相应的条件断点编号,调试器暂停执行;
第三方编译器,所述第三方编译器包括C语言编译器,用于将输出的所述C语言文件进行编译、汇编和链接,形成动态链接库;
加载单元,用于加载所述动态链接库,调用所述C语言文件中的断点函数,完成所述条件断点的加载,所述动态链接库被加载后,该动态链接库和调试器共享同一段进程空间,而对所述条件断点判断执行中的各变量可归结到从固定地址取固定长度的数据进行处理。
5.根据权利要求4所述的装置,其特征在于:所述装置还包括存储单元,用于通过所述存储单元将接收的断点信息存储在断点缓冲器中。
6.根据权利要求4所述的装置,其特征在于:所述输出单元还用于将变量进程地址和所述断点函数一起输出。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110207453.8A CN102262587B (zh) | 2011-07-22 | 2011-07-22 | 一种断点调试方法和调试器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110207453.8A CN102262587B (zh) | 2011-07-22 | 2011-07-22 | 一种断点调试方法和调试器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102262587A CN102262587A (zh) | 2011-11-30 |
CN102262587B true CN102262587B (zh) | 2014-12-31 |
Family
ID=45009223
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110207453.8A Expired - Fee Related CN102262587B (zh) | 2011-07-22 | 2011-07-22 | 一种断点调试方法和调试器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102262587B (zh) |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100555224C (zh) * | 2006-07-06 | 2009-10-28 | 上海科泰世纪科技有限公司 | 一种可执行的动态连接库car构件的构造和执行方法 |
CN100456260C (zh) * | 2006-12-21 | 2009-01-28 | 华为技术有限公司 | 一种用于对解释语言程序进行调试方法及装置 |
US20100095281A1 (en) * | 2008-10-14 | 2010-04-15 | Riverside Research Institute | Internal Function Debugger |
CN101446918B (zh) * | 2008-12-10 | 2011-12-28 | 中兴通讯股份有限公司 | 一种实现用户态调试器调试单个函数的方法及系统 |
-
2011
- 2011-07-22 CN CN201110207453.8A patent/CN102262587B/zh not_active Expired - Fee Related
Non-Patent Citations (1)
Title |
---|
一种具有快速条件断点的并行程序调试器;刘建等;《软件学报》;20031130;第14卷(第11期);第1828页第1段至第1832页第3段 * |
Also Published As
Publication number | Publication date |
---|---|
CN102262587A (zh) | 2011-11-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107608677B (zh) | 一种编译处理方法、装置及电子设备 | |
EP1178404B1 (en) | Method and system for compiling multiple languages | |
US7725883B1 (en) | Program interpreter | |
AU774467B2 (en) | Automatic stub/adapter generator | |
JP4806060B2 (ja) | コンパイラ・プログラム、コンパイル方法及びコンピュータ・システム | |
US9146759B2 (en) | Assumption-based compilation | |
CN110569628B (zh) | 一种代码的混淆方法以及装置、计算机设备、存储介质 | |
US9329974B2 (en) | Technologies for determining binary loop trip count using dynamic binary instrumentation | |
Hummel et al. | Annotating the Java bytecodes in support of optimization | |
KR950006609B1 (ko) | 다중 패스코드 발생에 있어서 템플리트를 이용한 다중 언어 최적화 컴파일러 | |
Leroy | Coinductive big-step operational semantics | |
CN104965687A (zh) | 基于指令集生成的大数据处理方法及装置 | |
Chevalier-Boisvert et al. | YJIT: a basic block versioning JIT compiler for CRuby | |
Luckow et al. | HVMTP: a time predictable and portable java virtual machine for hard real-time embedded systems | |
CN102262587B (zh) | 一种断点调试方法和调试器 | |
CN102411534B (zh) | 一种断点调试方法和断点调试装置 | |
Mohnen | A graph—free approach to data—flow analysis | |
Mosaner et al. | Supporting on-stack replacement in unstructured languages by loop reconstruction and extraction | |
CN102831004B (zh) | 一种基于C*core处理器的优化编译方法及编译器 | |
Chambers | Staged compilation | |
Kersten et al. | ResAna: a resource analysis toolset for (real‐time) JAVA | |
Besnard et al. | A framework for automatic and parameterizable memoization | |
Luszczek et al. | High performance development for high end computing with Python Language Wrapper (PLW) | |
WO2022035476A1 (en) | Representing asynchronous state machine in intermediate code | |
CN112799724A (zh) | 一种稳定控制装置策略表解析计算方法及装置 |
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 |
Granted publication date: 20141231 Termination date: 20190722 |
|
CF01 | Termination of patent right due to non-payment of annual fee |