CN100343819C - 一种遍历和访问被测应用程序中对象的方法 - Google Patents
一种遍历和访问被测应用程序中对象的方法 Download PDFInfo
- Publication number
- CN100343819C CN100343819C CNB2003101210723A CN200310121072A CN100343819C CN 100343819 C CN100343819 C CN 100343819C CN B2003101210723 A CNB2003101210723 A CN B2003101210723A CN 200310121072 A CN200310121072 A CN 200310121072A CN 100343819 C CN100343819 C CN 100343819C
- Authority
- CN
- China
- Prior art keywords
- application program
- memory
- address
- class
- tested application
- 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
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种遍历和访问被测应用程序中对象的方法,该方法为:将测试工具注入被测应用程序,使测试工具和被测应用程序运行于相同的进程空间,所述被测应用程序为以Delphi实现的应用程序;由测试工具对所述被测应用程序占用的实际内存空间进行搜索,查找到用于生成特定对象的类的内存地址,其中该特定对象包含有被测应用程序所有已创建窗口对象的信息并指向所述类;根据所述类的内存地址和所述特定对象的存放格式及特征找到该特定对象的内存地址;遍历存放所述特定对象占用的内存区域,根据各对象的特征和存放格式查找和访问各窗口对象以及窗口对象包含的其他对象的内容。
Description
技术领域
本发明涉及通信或电子领域中的测试技术,尤其涉及一种遍历和访问被测应用程序中对象的方法。
背景技术
在测试过程中经常需要获取被测应用程序一些对象的各种信息,典型的如行自动测试时,需要自动获取界面对象的各种信息,比如界面对象表面的文字,该对象的位置、大小、颜色等等。由于源程序在编译生成可执行程序之后,原先在源代码中可见的各种符号,比如函数名称、类的内部变量等都被替换成了内存地址等数字,这使得访问运行阶段的对象信息变得困难。
Windows等操作系统为每个位应用程序提供独立的内存地址空间,并且对这些空间加以保护,不允许一个进程随便访问其它进程空间的信息,因此使得传统的独立运行的测试工具无法直接访问被测应用程序内部的各种所需信息。
现有技术中主要有两种方案来访问被测应用程序的内部信息:
方案一、在访问界面对象方面,通过windows提供的应用编程接口(API)来访问界面对象的部分信息,比如标题大小位置等。可见的界面对象一般都继承自window对象,windows提供了一组函数用以访问这些window的一些基本属性。比如首先设法获取界面对象的句柄(handle),比如可以通过window的WindowFromPoint函数获取指定位置的一个可见界面对象的handle。然后根据该handle可以获得一系列的信息,比如窗口的标题、位置、大小风格等。
虽然采用方案一能够获得对象的部分信息,但存在以下缺点:
1、windows仅仅提供了最基本的一些对象的识别和获取这些对象属性的方法,对于各种自定义的对象,则无法或者极难获得必须的信息。
2、对于一些特殊的可见对象无法识别。
方案二、通过在源代码中加入一些额外的代码,由这些代码作为一个桥梁,把程序内部的信息传递出来,并响应外部的控制。比如Rational公司为了能够使其测试工具Rebot能够识别更多的Delphi开发的应用程序的界面对象,编写了一个叫做《SQASrvr.pas》的模块,把该模块和被测应用程序一同编译,就能够实现对被测应用程序各种界面对象的识别。其基本原理是通过对Delphi界面对象的修改,向外提供Com接口用来访问这些界面对象的重要的信息。
虽然方案二理论上可以实现对所有种类对象的所有信息的访问,但仍存在以下缺点:
1、对于已编译的可执行程序,不能发挥作用;对不许修改源程序的应用也不能发挥作用,因而该方法的使用受到限制。
2、若访问的对象种类很多,访问的信息很多,则试图通过该通用模块达到目的的做法将使实现复杂度增加。
3、若不通过独立通用的模块,而是采用在被测试程序代码内部各部分增加接口代码的方法来达到目的,则使得代码的维护工作量剧增。
发明内容
本发明的目的在于提供一种遍历和访问被测应用程序中对象的方法,以解决采用现有技术访问被测应用程序内部信息存在复杂性高和使用受限制的问题。
解决上述问题,本发明提供下述技术方案:
一种遍历和访问被测应用程序中对象的方法,该方法包括步骤:
将测试工具注入被测应用程序,使测试工具和被测应用程序运行于相同的进程空间,所述被测应用程序为以Delphi实现的应用程序;
由测试工具对所述被测应用程序占用的实际内存空间进行搜索,查找到用于生成特定对象的类的内存地址,其中该特定对象包含有被测应用程序所有已创建窗口对象的信息并指向所述类;
根据所述类的内存地址和所述特定对象的存放格式及特征找到该特定对象的内存地址;
遍历存放所述特定对象占用的内存区域,根据各对象的特征和存放格式查找和访问各窗口对象以及窗口对象包含的其他对象的内容。
根据上述方法:
将测试工具注入被测应用程序由被测应用程序通过插件接口主动调用测试工具来实现,或者通过将测试工具强行插入被测试对象来实现。
测试工具查找用于生成特定对象的类的内存地址包括步骤:
(1)判断一定长度的内存区是否能找到一块保存有自身地址的内存,如果是则进行步骤(2),否则进行步骤(4);
(2)取所述一块内存的前一段存放的内容,并判断该内容是否是一个记录了类名称的字符串的地址,如果是则进行步骤(3),否则进行步骤(4);
(3)从所述内存区内的指定偏移位置取记录该类的实例所占内存大小的值,并判断是否与实际类的大小相符,如果是则查找到用于生成特定对象的类,结束该次查找,否则进行步骤(4);
(4)继续在下一内存区进行查找,并进行步骤(1)。
测试工具访问对象内容至少包括访问对象内部属性变量和对象内部函数。
访问对象内部属性变量包括步骤:
根据该对象的内存中的地址和内部属性变量的地址偏移得到该内部属性变量的实际内存地址;
调用接口函数从所述实际内存地址获取内部属性变量的值或向所述实际内存赋值。
访问对象内部函数包括步骤:
从被测应用程序的MAP文件中获取对象内部函数的地址偏移;
根据所述地址偏移和被测应用程序的代码段在内存中的实际地址得到所述内部函数的实际地址;
调用所述内部函数并将参数传递给该函数;以及
获取返回结果。
本发明具有以下有益效果:
1、把测试工具注入到被测试程序,使得访问被测试程序内部信息相对于独立运行的工具而言简单很多,由于避过了操作系统的限制,因此访问这些信息十分方便,也更加安全可靠。
2、通过根据类和对象特征进行搜索的方法,能够遍历所有的对象,借助于Map文件等手段,使得访问和控制这些对象效率更高,也更加可靠。
3、由于不对源程序进行修改,因此减少了测试程序代码和源程序代码共同维护协调的工作量,也避免了工具代码对被测试程序在源代码一级的影响。
附图说明
图1为实施本发明的计算机装置结构图;
图2为本发明的主流程图;
图3为查找类的内存地址的流程图。
具体实施方式
在面向对象的理论中,类和对象是两个重要的概念。类可以形象的理解为提供生成对象的模块子,而对象则是由类生成的实体。软件由源代码编译成可执行程序后,类被以某种确定的格式存放在内存中,类实例化后成为一个对象。
本发明根据对象的格式以及存放位置,通过内存映射来访问该对象的内部变量,通过调用对象的内部函数来获取所需信息。其中,所述对象的内部变量是指仅用于存放数据的变量,与一些面向对象描述中的类的属性相似,但那些读写过程将引发相应的动作的属性不在此列;所述类的内部函数指类的方法。
图1显示了一台计算机,用它来实施描述的方法。计算机具有一个处理器,它通过总线和存储器相连接,同时还通过总线连接输入输出接口。
存储器储存了计算机运行所需基本的计算机程序,如视窗操作系统(Windows)等,以及测试工具和被测应用程序。输入输出接口连接键盘、外部存储器和显示器,测试工具对被测应用程序的测试信息等通过显示器显示出来。
应用程序在计算机中运行时,由于操作系统为每一个应用程序建立一个进程空间并对进程空间进行足够的保护,使不同的应用程序运行于不同的进程空间。因此,使得不同的应用之间信息访问变得困难。为了绕过操作系统的限制,本发明将测试工具注入被测应用程序。
测试工具注入被测应用程序的方法有很多,一种最简单的方法是被测试应用提供插件接口,测试工具编译成动态库,由被测试应用主动调用测试工具;这种方法对于测试工具而言是被动侵入被测试应用,依赖于被测试对象必须实现提供这样的接口。主动侵入到被测试对象的方法现有技术中有多种,如:通过全局系统钩子(system hook)来实现。系统钩子是指通过操作系统的钩子API函数(比如Windows的SetWindowsHookEx函数),通过调用SetWindowsHookEx(WH_mouse,HookHandler,HInstance,0)函数可以为鼠标操作设置一个钩子,也就是当应用程序接受到鼠标操作时,会因为这个钩子而自动触发HookHandler指向的函数,该函数是通过动态库实现的一个回调函数,也就是应用程序遇到鼠标操作时会检查是否已经装入该实现了回调函数的动态库,如果没有就会把该动态库加载起来,如果已经加载过该动态库了就可以直接调用函数了;因此,通过系统钩子来实现利用的只是被测试应用自动加载动态库这样一个属性,一旦测试工具被加载到被测试应用程序空间,让工具与被测试应用运行在同一空间的目标就实现了。又如:通过Windows提供的创建远程线程的方式,通过触发程序在被测应用程序中动态创建一个线程,该线程则完成装入指定动态库的方法,通常的方法是调用CreateRemoteProcess(),在被测试应用中创建一个线程,该线程负责的工作就是执行LoadLibrary函数,而LoadLibrary函数的参数就是我们的测试工具的动态库,比如工具的动态库叫做“testtool.dll”,通过下面一组调用即可实现:
dllspace:=VirtualAllocEx(process,nil,length(dllname),MEM_COMMIT,PAGE_readwrite);
WriteProcessMemory(process,dllspace,'testtool.dll',length(‘testtool.dll'),count);
proc:=getprocaddress(getmodulehandle(′Kernel32.dll′),′LoadLibraryA′);
newthread:=CreateRemoteThread(process,nil,0,proc,dllspace,0,threadid);
VirtualFreeEx(process,nil,length(dllname),MEM_COMMIT)。
本发明搜索对象的基本方法是在被测应用进程的内存空间对满足指定特征的内存块进行搜索,把满足特征的内存地址记录下来,映射成一个对象。
源程序被编译成可执行程序之后,会把所有的类(模子)按照一定的顺序和结构组织存放在可执行程序中,当可执行程序执行起来之后,类会被装入到内存中,也就是类会被按照一定的格式和顺序存放到内存的某位置。对象则是被测试应用执行起来之后,通过调用类的构造函数生成的类的一个实例,对象的构造函数一般只是完成对象的空间分配和初始设置,对象被创建出来之后也只是一段存放在特定位置、存放了一些特定信息的特定大小内存。对象的内部属性变量则就是对象所占有的特定内存块中的特定区域。对象的内部函数,则无论对应于几个对象,都只有一个函数实体,区分不同的对象是通过把对象所指的地址作为对象函数的第一参数来实现的(当然这个参数在实际编写源代码时是不用显式给出的,编译器帮助完成了此项工作)。
在窗口应用程序中,有一个特定的对象,该对在程序运行一开始即被创建,并存放该应用程序所有已建的窗口,而每个窗口对象中则又存放了所有界面控件,每个界面控件则又存放了所有的子控件,同时该对象的相应指针指向生成的该对象的类。因此可以通过遍历该对象在内存中的存放结构取出所有的界面对象。
参阅图2所示,本发明的主要流程如下:
步骤10:将测试工具注入被测应用程序,并启动程序进行测试。
步骤20:由测试工具对被测应用程序占用的实际内存空间进行搜索,查找到用于生成特定对象的类的内存地址,其中该特定对象包含有被测应用程序所有已创建窗口对象的信息并指向所述类。
步骤30:根据所述类的内存地址和所述特定对象的存放格式及特征找到该特定对象的内存地址。
步骤40:遍历存放所述特定对象占用的内存区域,根据各对象的特征和存放格式查找和访问各窗口对象以及窗口对象包含的其他对象的内容。
参阅图3所示,步骤20的具体处理过程如下:
步骤100:开始遍历一定长度的内存区;
步骤120:判断是否能找到一块内存(32位操作系统对应4字节),其中存放这段内存自身的地址,比如在地址段0xaaaaaaaa中存放内容为0xaaaaaaaa,如果是则进行步骤130,否则进行步骤160;
步骤130:取所述内存区前一段存放的内容,如步骤120中0xaaaaaaaa地址前的4个字节空间0xaaaaaaa6,并判断该内容是否是一个记录了类名称的字符串的地址,如果是则进行步骤140,否则进行步骤160;
步骤140:从所述内存区内的指定偏移位置取记录该类的实例所占内存大小的值,并判断是否与实际类的大小相符,如果是则进行步骤150,否则进行步骤160;
步骤150:查找到用于生成特定对象的类的地址并结束该次查找;
步骤160:继续在下一内存区进行查找,并进行步骤120。
测试工具访问对象内容至少包括访问对象内部属性变量和对象内部函数。
访问对象内部属性变量是根据该对象的内存中的地址和内部属性变量的地址偏移得到该内部属性变量的实际内存地址,然后调用接口函数从所述实际内存地址获取内部属性变量的值或向所述实际内存赋值。
访问对象内部函数是从被测应用程序的MAP文件中获取对象内部函数的地址偏移,然后根据所述地址偏移和被测应用程序的代码段在内存中的实际地址得到所述内部函数的实际地址,最后调用所述内部函数并将参数传递给该函数并获取返回结果。
为了更清楚的描述本发明的方法,下面以Delphi5.0实现的应用程序为例进行详细说明:
1、对象的搜索
在Delphi5.0中,编译后的应用程序,所有类(class)被以固定格式存放在一定连续的空间,其格式为:
vmtSelfPtr | -76 | 存放指向该class自身的指针 |
vmtIntfTable | -72 | … |
vmtAutoTable | -68 | … |
vmtInitTable | -64 | … |
vmtTypeInfo | -60 | … |
vmtFieldTable | -56 | … |
vmtMethodTable | -52 | … |
vmtDynamicTable | -48 | … |
vmtClassName | -44 | 存放该类名称的指针 |
vmtInstanceSize | -40 | 该类的实例大小 |
vmtParent | -36 | 存放夫类的指针 |
vmtSafeCallException | -32 | … |
vmtAfterConstruction | -28 | … |
vmtBeforeDestruction | -24 | … |
vmtDispatch | -20 | … |
vmtDefaultHandler | -16 | … |
vmtNewInstance | -12 | … |
vmtFreeInstance | -8 | … |
vmtDestroy | -4 | … |
vmtQueryInterface | 0 | … |
vmtAddRef | 4 | … |
vmtRelease | 8 | … |
vmtCreateObject | 12 | … |
由此,若要通过遍厉内存的方式来查找类的存放位置,当知道一个类的名称、实例大小、父类等信息时,就可以利用上述规则。首先通过vmtSelfPtr指针判断目标指针是否指向合法的类,然后可通过对象名称、对象实例大小、父类等信息进一步确认。
一个对象在内存中的结构则相对简单,前四个字节存放该对象所属的类的指针,随后则存放所有的内部变量。例如这样一个类:
classa=class
a,b,c:integer;
end;
另一个类如下:
classb=class(classa)
aa,a:integer;
procudure proca;
function funcb(a,b,c:integer):integer;
end;
若创建一个classb类的实例objb,内存中对应存储的数据应为:
内容 | 大小 |
指向类型b的指针 | 4字节 |
继承自类classa的内部变量a | 4字节 |
继承自类classa的内部变量b | 4字节 |
继承自类classa的内部变量c | 4字节 |
classb的内部变量aa | 4字节 |
classb的内部变量a | 4字节 |
若了解一个对象设计实现的有关信息,再搜索这个对象的实例,就比较简单。,首先,判断某指定的内存前四个字节是否指向正确的类的地址,然后根据所了解的某些内部变量的值进行进一步确认。
在delphi5.0的窗口应用程序中有两个预定义好的对象非常重要,一个是TScreen类的screen对象,一个是TApplication类的application对象,这两个对象在程序运行一开始即被自动创建,存放了非常重要的信息,其中在Screen对象中,存放了该应用程序所有已经创建的窗口,而每个窗口对象中则又存放了所有界面控件,每个界面控件中则存放了所有的子控件。由此在界面测试中,可以通过该结构遍历取出所有的界面对象。以此为例进一步介绍搜索对象的过程。
首先检索出TScreen类在内存中的位置,检索方法:对指定一块的内存进行遍历,判断是否有一内存前76字节出连续4个字节存放着该内存所对应的地址值,若是则表明可能是一段类的数据,在将其前44个字节存放的内容取出,判断指向的是否是一段记录了类名称的字符串。若是基本可以确定是存放TScreen类的内存块了,可以通过实例大小做进一步确认。
找到Tscreen类的位置后,记录该地址,然后搜索screen的位置,搜索方法是:遍历内存,找到前四字节值等于Tscreen位置值的内存,该位置可能存放的就是一个Screen实例,然后,再根据对Screen对象细节的一些了解进行进一步确认,Tscreen继承自Tcomponent对象,通过分析可以知道,Screen对象的父对象为空,对象中的名称属性为空,由此可以得到进一步确认依据:该内存第四字节往后连续四字节值为0,再接着的4个字节存放一个指针,指向一个内容为空的字符串。满足这些特性的内存一定指向Screen对象。
Delphi中的Tscreen对象中有一个属性叫做FormList,其中存放了被测试应用中的所有已经创建的窗口的实例指针,窗口都继承自Tcomponent,每个窗口都有一个属性叫做Components,还有一个属性叫做Controls,分别存放着窗口中包含的所有不可见的控件(比如一个定时器,或者Socket控件)以及所有的可见控件(比如Button,EditBox,Label等)。
2、对象内部属性变量的映射
找到了对象实例的地址,若工具本身就是通过delphi5.0写的,则在实现工具的源代码一级已经可以访问对象的各项内容了。但是为了在工具运行阶段实现对各种对象方面的访问,需要使用以下描述的方法。
根据前文描述,对象实例中存放着包括对象所属类以及所有祖先类的所有内部变量。据此,可以抽象成统一的接口函数供工具中脚本引擎模块使用,测试工具使用的是python的引擎,在工具运行阶段,通过调用接口函数访问对象内部指定偏移处的信息,并对各指定偏移进行命名(在设计时对象各个内部变量是有名称、类型以及具体含义的,但是经过编译后这些信息都被丢掉了,只能通过设计实现时定义的结构推算各字段也就是对象的内部变量的偏移,然后根据偏移量获取这些字段的值,可以在脚本中重新给这些偏移定义名称)。
仍然以前面的例子为例,获知对象objb在内存中的位置,并且想要获得objb内部变量aa,经推算,可以知道该字段在对象中的偏移为:16,大小为4个字节,因此只要从对象objb对应地址偏移16的位置开始取4个字节,即为aa的值,要想取从classa继承过来的字段a,可以从偏移4的位置取4个字节,即为对象objb从classa继承过来的a字段的值。接口函数可以实现如下:
function GetObjKeyValue(obj:pointer;offset:integer;size:integer):integer;
begin
result:=0;
move((obj+offset)^,result,size);
end;//pascal中result表示返回值
然后通过python提供的api将该函数转换为python可以调用的函数(具体方法为现有技术,不在此列出)。
3、对象内部方法的映射
获取对象的内部变量是相对比较容易的,只要能够算出具体的偏移,并获得对象的地址,即可按照上述方法进行。
调用对象的方法则相对困难一些,在工具的源程序一级对已经搜索出来的对象进行函数调用是直接而简单的,和调用通常的对象的方法没有什么区别。但是若试图在脚本中调用对象的方法,则需要使用下面方法:
由于源代码在编译成执行程序之后,类和对象内部的很多信息都丢失了,比如对象内部变量的名称、对象内部函数方法的名称、这些函数方法的调用原形返回值等都在编译成执行文件的过程中丢失了。因此若想在运行阶段获取对象的内部函数方法的位置并正确的调用他们基本上是不可能的,必须借用编译过程生成的一些附件,并根据这些信息实现对对象内部函数的访问。
(1)获取对象内部函数的位置(地址)的方法:
在编译过程中可以把生成Map的开关设置为detail级别,这样编译过程中,编译器将会把源代码所有变量、函数、类型等符号对应在执行程序中的偏移位置记录下来,然后根据这个偏移计算出执行期间的各符号在内存中的位置。
比如delphi5.0编译生成Map文件后,有类似如下的记录:
0001:00032638 classb.proca
0001:000326aa classb.funcb
冒号前面的一个数字,表示在哪个段,通常0001表示代码段,00002表示数据段,具体情况可以查看map文件开头的段定义部分,冒号后面的数字是表示在段中的偏移,空格后面的标识符是源代码中的符号。上面一段的文字含义为:classb的proca函数在代码段的032638位置。classb的funcb在代码段的0326aa位置。实际运行阶段需要把该偏移位置信息转换成内存地址信息。
代码段中的偏移转换成地址信息方法为:代码段装入内存的实际位置加上述偏移。而代码段装入内存时的实际位置写在可执行程序的pehead部分,通过对pehead进行分析,可以获得该偏移(具体方法为现有技术,可参见pehead结构描述和分析的有关文献,有一个win32的api函数MapAndLoad可以将pehead的信息,并且有预定义好的结构PImageNtHeaders描述了pehead的结构,该结构中有BaseOfData以及BaseOfCode两个字段,分别记录了装入内存后数据段和代码段在内存中的实际位置)。把代码段的实际位置加上函数在代码段中的偏移,就能够获得函数的入口地址。
(2)在脚本中调用函数
有了函数的入口地址,还要能够调用函数,本实施例提供一种通过汇编实现函数调用的方法。
很多编程工具都提供了汇编接口,通过汇编接口调用函数需要正确的把参数传递给被调用者,否则将产生异常,函数的参数传递通常有两种方法,一种是从左到右的压栈传递,另一种是从右到左的压栈传递方法。不同的工具可能还会定义其它的参数传递方法,比如在delphi中还通过寄存器eax、ecx、edx传递前三个参数的方法以提高函数调用时参数传递的速度。据此可以设计调用函数的方法,比如计算得知classb的funcb函数在内存中的地址为01234567,对象objb在内存中的位置为7654321,如果想获得funcb(1,2,3)的值,可以用下面代码完成:
asm
mov eax,7654321//第1个参数
mov ecx,1 //第2个参数
mov edx,2 //第3个参数
push 3 //第4个参数
call 1234567 //执行函数funcb
mov result,eax //获得结果
end
共传递了4个参数,其中第一个参数定义时未曾看到,这是隐含的,在通过原码调用funb(1,2,3)时,编译器会自动把所在的对象作为第一个参数传给该函数,用以传递具体的对象。
(3)获取返回结果
通过汇编的方法调用函数后,eax中存放的为函数的返回结果,取之即可。
本发明把测试工具注入到被测试程序,使得访问被测试程序内部信息相对于独立运行的工具而言简单很多,由于避过了操作系统的限制,因此访问这些信息十分方便,也更加安全可靠。由于采用本发明的方法不需要对源程序进行修改,因此减少了测试程序代码和源程序代码共同维护协调的工作量,也避免了工具代码对被测试程序在源代码一级的影响。
Claims (6)
1、一种遍历和访问被测应用程序中对象的方法,其特征在于,该方法包括步骤:
将测试工具注入被测应用程序,使测试工具和被测应用程序运行于相同的进程空间,所述被测应用程序为以Delphi实现的应用程序;
由测试工具对所述被测应用程序占用的实际内存空间进行搜索,查找到用于生成特定对象的类的内存地址,其中该特定对象包含有被测应用程序所有已创建窗口对象的信息并指向所述类;
根据所述类的内存地址和所述特定对象的存放格式及特征找到该特定对象的内存地址;
遍历存放所述特定对象占用的内存区域,根据各对象的特征和存放格式查找和访问各窗口对象以及窗口对象包含的其他对象的内容。
2、如权利要求1所述的方法,其特征在于,将测试工具注入被测应用程序,由被测应用程序通过插件接口主动调用测试工具来实现,或者用测试工具强行插入被测试对象的方法实现。
3、如权利要求1所述的方法,其特征在于,测试工具查找用于生成特定对象的类的内存地址包括步骤:
(1)判断一定长度的内存区是否能找到一块保存有自身地址的内存,如果是则进行步骤(2),否则进行步骤(4);
(2)取所述一块内存的前一段存放的内容,并判断该内容是否是一个记录了类名称的字符串的地址,如果是则进行步骤(3),否则进行步骤(4);
(3)从所述内存区内的指定偏移位置取记录该类的实例所占内存大小的值,并判断是否与实际类的大小相符,如果是则查找到用于生成特定对象的类,结束该次查找,否则进行步骤(4);
(4)继续在下一内存区进行查找,并进行步骤(1)。
4、如权利要求1所述的方法,其特征在于,测试工具访问对象内容至少包括访问对象内部属性变量和对象内部函数。
5、如权利要求4所述的方法,其特征在于,访问对象内部属性变量包括步骤:
根据该对象的内存中的地址和内部属性变量的地址偏移得到该内部属性变量的实际内存地址;
调用接口函数从所述实际内存地址获取内部属性变量的值或向所述实际内存赋值。
6、如权利要求4所述的方法,其特征在于访问对象内部函数包括步骤:
从被测应用程序的MAP文件中获取对象内部函数的地址偏移;
根据所述地址偏移和被测应用程序的代码段在内存中的实际地址得到所述内部函数的实际地址;
调用所述内部函数并将参数传递给该函数;以及
获取返回结果。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2003101210723A CN100343819C (zh) | 2003-12-24 | 2003-12-24 | 一种遍历和访问被测应用程序中对象的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2003101210723A CN100343819C (zh) | 2003-12-24 | 2003-12-24 | 一种遍历和访问被测应用程序中对象的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1632761A CN1632761A (zh) | 2005-06-29 |
CN100343819C true CN100343819C (zh) | 2007-10-17 |
Family
ID=34844037
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2003101210723A Expired - Fee Related CN100343819C (zh) | 2003-12-24 | 2003-12-24 | 一种遍历和访问被测应用程序中对象的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100343819C (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103823663B (zh) * | 2012-11-19 | 2017-12-01 | 腾讯科技(深圳)有限公司 | 一种调用成员变量的方法和装置 |
WO2014188492A1 (ja) | 2013-05-20 | 2014-11-27 | 三菱電機株式会社 | 監視制御装置 |
CN106909458A (zh) * | 2015-12-23 | 2017-06-30 | 北京奇虎科技有限公司 | 内存管理方法及装置 |
CN110083520B (zh) * | 2018-01-25 | 2022-09-13 | 迈普通信技术股份有限公司 | 数据获取方法及装置 |
CN110347407A (zh) * | 2019-07-16 | 2019-10-18 | 武汉斗鱼鱼乐网络科技有限公司 | 一种获取内存占用量的方法、装置、计算机设备及介质 |
CN113238800B (zh) * | 2021-05-25 | 2022-06-28 | 上海安路信息科技股份有限公司 | 堆栈帧结构和函数调用方法及系统 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5600789A (en) * | 1992-11-19 | 1997-02-04 | Segue Software, Inc. | Automated GUI interface testing |
WO2002054168A2 (en) * | 2001-01-04 | 2002-07-11 | International Business Machines Corporation | Method and apparatus for exercising an unknown program with a graphical user interface |
-
2003
- 2003-12-24 CN CNB2003101210723A patent/CN100343819C/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5600789A (en) * | 1992-11-19 | 1997-02-04 | Segue Software, Inc. | Automated GUI interface testing |
WO2002054168A2 (en) * | 2001-01-04 | 2002-07-11 | International Business Machines Corporation | Method and apparatus for exercising an unknown program with a graphical user interface |
Non-Patent Citations (3)
Title |
---|
GUI Ripping: Reverse Engineering of GraphicalUser Interfaces for Testing Atif Memon,Ishan Banerjee,Adithya Nagarajan,Proceedings of the 10th Working Conference on Reverse Engineering(WCRE03) 2003 * |
GUI自动测试工具设计与实现 杨凡德,李小将,闫舒,装备指挥技术学院学报,第14卷第3期 2003 * |
Three Ways To Inject Your Code Into Another Process Robert Kuster,http://www.codeguru.com/Cpp/W.P/system/processesmodules/article.php/c5767 2003 * |
Also Published As
Publication number | Publication date |
---|---|
CN1632761A (zh) | 2005-06-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110162296B (zh) | 应用程序编程接口文档的生成方法、装置及终端设备 | |
Gremme et al. | GenomeTools: a comprehensive software library for efficient processing of structured genome annotations | |
CN1183447C (zh) | 用于发送表构造的方法 | |
US9069568B2 (en) | Compilation dependency resolution from a diverse group of candidate resources | |
CN1134730C (zh) | 用于减少预装类的脚印的系统和方法 | |
US8347266B2 (en) | Declarative object identity | |
US8443338B2 (en) | Logical extensions to intermediate code | |
CN1105802A (zh) | 增量建立系统 | |
CN1140500A (zh) | 分布式数据库系统 | |
CN1776620A (zh) | 识别源代码中的固定存储器地址错误的装置、系统和方法 | |
US8438468B2 (en) | Annotation management | |
CN1552026A (zh) | 用于处理数据表示语言对象的编程语言扩展和相关应用 | |
CN1218245C (zh) | 用于在数据处理器中预加载类的系统和方法 | |
US7350198B2 (en) | Creating and checking runtime data types | |
CN101042645A (zh) | 统一软件开发环境的方法、设备及系统 | |
US6996804B2 (en) | Adapting polymorphic inline caches for multithreaded computing | |
Bonetta et al. | FAD. js: fast JSON data access using JIT-based speculative optimizations | |
Ducournau | Implementing statically typed object-oriented programming languages | |
CN100343819C (zh) | 一种遍历和访问被测应用程序中对象的方法 | |
US20160253157A1 (en) | Software refactoring | |
CN1658159A (zh) | 可配置和可动态更改的对象模型 | |
CN1525317A (zh) | 在标记中用于定义和使用子级说明的系统和方法 | |
US8935657B2 (en) | Model-to-model transformation by kind | |
CN101030149A (zh) | 快速的基于补丁的方法调用 | |
CN1245685C (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 | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20071017 Termination date: 20131224 |