类继承结构信息获取方法、装置及电子设备与流程

文档序号:15346354发布日期:2018-09-04 22:48阅读:165来源:国知局

本发明涉及应用开发技术领域,具体而言,涉及一种类继承结构信息获取方法、装置及电子设备。



背景技术:

随着智能设备的应用范围的不断扩大,应用于各类智能设备的应用软件也得到了广泛的关注。其中,在应用软件的开发过程中,开发人员可能需要根据对象的内存结构以获取到该类的完整继承结构信息。经发明人研究发现,在现有的技术中对象的完整继承结构信息的方式存在不便的问题。



技术实现要素:

有鉴于此,本申请的目的在于,提供一种类继承结构信息获取方法、装置及电子设备以改善上述问题。

本申请实施例提供一种类继承结构信息获取方法,所述方法包括:

获取待分析类对象中的rtticompleteobjectlocator结构,访问所述rtticompleteobjectlocator结构以获得该结构中的pclasshierarchydescriptor字段;

根据所述pclasshierarchydescriptor字段的指向信息获得rtticlasshierarchydescriptor结构,访问所述rtticlasshierarchydescriptor结构以获得该结构中的numbaseclasses字段以及pbaseclassarray字段;

根据所述numbaseclasses字段获得所述待分析类对象的基类的个数;

获得所述pbaseclassarray字段指向的rttibaseclassdescriptor结构体数组;

根据所述基类的个数依次访问所述rttibaseclassdescriptor结构体数组中的数组元素,以获得所述待分析类对象的所有基类的名称信息。

进一步地,所述根据所述基类的个数依次访问所述rttibaseclassdescriptor结构体数组中的数组元素,以获得所述待分析类对象的所有基类的名称信息的步骤,包括:

根据获得的基类的个数访问所述rttibaseclassdescriptor结构体数组,以获得所述rttibaseclassdescriptor结构体数组中与所述个数一致的多个数组元素的每一个数组元素中的ptypedescritptor字段;

针对获得的每一项数组元素,获得所述数组元素中的ptypedescritptor字段所指向的typedescritptor结构;

访问所述typedescritptor结构以获得所述typedescritptor结构中的name字段,并获得所述name字段处的字符串中记录的该数组元素中的基类的名称信息,以获得所述待分析类对象的所有基类的名称信息。

进一步地,所述获取待分析类对象中的rtticompleteobjectlocator结构的步骤,包括:

获取待分析类对象的虚函数表的地址;

根据所述虚函数表的地址获得所述待分析类对象中的rtticompleteobjectlocator结构的地址;

查找所述rtticompleteobjectlocator结构的地址以获得所述rtticompleteobjectlocator结构。

进一步地,所述获取待分析类对象的虚函数表的地址的步骤之前,所述方法还包括:

检测所述待分析类对象中是否存在虚函数;

若不存在虚函数,则生成获取失败信息,若存在虚函数,则执行所述获取待分析类对象的虚函数表的地址的步骤。

进一步地,所述获取待分析类对象的虚函数表的地址的步骤之后,所述方法还包括:

检测是否启用运行时信息;

若未启用运行时信息,则生成获取失败信息,若已启用运行时信息,则执行根据所述虚函数表的地址获得所述待分析类对象中的rtticompleteobjectlocator结构的地址的步骤。

进一步地,所述根据所述虚函数表的地址获得所述待分析类对象中的rtticompleteobjectlocator结构的地址的步骤,包括:

将所述虚函数表的地址减去指定数值以获得所述待分析类对象中的rtticompleteobjectlocator结构的地址。

进一步地,所述获取待分析类对象的虚函数表的地址的步骤,包括:

获取所述待分析类对象的起初地址;

获得从所述起初地址开始的第一个4字节的整型值以得到所述待分析类对象具有的虚函数对应的虚函数表的地址。

本申请实施例还提供一种类继承结构信息获取装置,所述装置包括:

结构描述符字段获取模块,用于获取待分析类对象中的rtticompleteobjectlocator结构,访问所述rtticompleteobjectlocator结构以获得该结构中的pclasshierarchydescriptor字段;

基类信息获取模块,用于根据所述pclasshierarchydescriptor字段的指向信息获得rtticlasshierarchydescriptor结构,访问所述rtticlasshierarchydescriptor结构以获得该结构中的numbaseclasses字段以及pbaseclassarray字段;

个数获取模块,用于根据所述numbaseclasses字段获得所述待分析类对象的基类的个数;

数组获取模块,用于获得所述pbaseclassarray字段指向的rttibaseclassdescriptor结构体数组;

名称信息获取模块,用于根据所述基类的个数依次访问所述rttibaseclassdescriptor结构体数组中的数组元素,以获得所述待分析类对象的所有基类的名称信息。

本申请实施例还提供一种电子设备,包括:

存储器;

处理器;及

类继承结构信息获取装置,包括一个或多个存储于所述存储器中并由所述处理器执行的软件功能模块,所述类继承结构信息获取装置包括:

结构描述符字段获取模块,用于获取待分析类对象中的rtticompleteobjectlocator结构,访问所述rtticompleteobjectlocator结构以获得该结构中的pclasshierarchydescriptor字段;

基类信息获取模块,用于根据所述pclasshierarchydescriptor字段的指向信息获得rtticlasshierarchydescriptor结构,访问所述rtticlasshierarchydescriptor结构以获得该结构中的numbaseclasses字段以及pbaseclassarray字段;

个数获取模块,用于根据所述numbaseclasses字段获得所述待分析类对象的基类的个数;

数组获取模块,用于获得所述pbaseclassarray字段指向的rttibaseclassdescriptor结构体数组;

名称信息获取模块,用于根据所述基类的个数依次访问所述rttibaseclassdescriptor结构体数组中的数组元素,以获得所述待分析类对象的所有基类的名称信息。

本申请实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有指令,当所述指令被执行时,实现上述的类继承结构信息获取方法。

本申请实施例提供的类继承结构信息获取方法、装置及电子设备,基于待分析类对象的rtticompleteobjectlocator结构以获取其中的pclasshierarchydescriptor字段。根据pclasshierarchydescriptor字段的指向信息获得rtticlasshierarchydescriptor结构,并进一步获得其中的numbaseclasses字段以及pbaseclassarray字段。根据numbaseclasses字段可获得待分析类对象的基类的个数,根据pbaseclassarray字段可获得保存基类名称信息的rttibaseclassdescriptor结构体数组。根据基类个数以及rttibaseclassdescriptor结构体数组以获得待分析类对象的所有基类的名称信息。如此,可快速、有效地获得待分析类对象的基类的名称信息,改善了现有技术中存在的基类名称获取不便的问题,提高了开发人员的开发效率。

为使本发明的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1为本申请实施例提供的电子设备的结构框图。

图2为本申请实施例提供的类继承结构信息获取方法的流程图。

图3为图2中步骤s110的子步骤的流程图。

图4为图3中步骤s111的子步骤的流程图。

图5为本申请实施例提供的类继承结构信息获取方法的另一流程图。

图6为本申请实施例提供的类继承结构信息获取方法的另一流程图。

图7为图2中步骤s150的子步骤的流程图。

图8为本申请实施例提供的类继承结构信息获取装置的功能模块框图。

图标:100-电子设备;110-类继承结构信息获取装置;111-结构描述符字段获取模块;112-基类信息获取模块;113-个数获取模块;114-数组获取模块;115-名称信息获取模块;120-处理器;130-存储器。

具体实施方式

下面将结合本发明实施例中附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。

因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。

应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。

在通过c++语言进行应用软件的开发过程中,可能需要根据一个对象的实例,从对象的内存结构中获取到该对象的类名,并获取到该类的完整继承结构信息。通过发明人的长期研究,发现应用软件对应的计算机程序在编译启用了运行时信息的c++可执行文件中,编译器可向该可执行文件内部添加一些其它信息。

并且,可以得知在前述信息中包括有rtticompleteobjectlocator结构。进一步地,通过该rtticompleteobjectlocator结构进行分析,可以从中获取到类对象的所有基类的名称信息。

如图1所示,本发明实施例基于上述研究发现提供了一种电子设备100,所述电子设备100包括存储器130、处理器120和类继承结构信息获取装置110。

所述存储器130和处理器120之间直接或间接地电性连接,以实现数据的传输或交互。例如,这些元件相互之间可通过一条或多条通讯总线或信号线实现电性连接。所述类继承结构信息获取装置110包括至少一个可以软件或固件(firmware)的形式存储于所述存储器130中的软件功能模块。所述处理器120用于执行所述存储器130中存储的可执行的计算机程序,例如,所述类继承结构信息获取装置110所包括的软件功能模块及计算机程序等,以实现类继承结构信息获取方法。

其中,所述存储器130可以是,但不限于,随机存取存储器(randomaccessmemory,ram),只读存储器(readonlymemory,rom),可编程只读存储器(programmableread-onlymemory,prom),可擦除只读存储器(erasableprogrammableread-onlymemory,eprom),电可擦除只读存储器(electricerasableprogrammableread-onlymemory,eeprom)等。其中,存储器130用于存储程序,所述处理器120在接收到执行指令后,执行所述程序。

所述处理器120可能是一种集成电路芯片,具有信号的处理能力。上述的处理器120可以是通用处理器,包括中央处理器(centralprocessingunit,cpu)、网络处理器(networkprocessor,np)等;还可以是数字信号处理器(dsp)、专用集成电路(asic)、现场可编程门阵列(fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器120也可以是任何常规的处理器等。

可以理解,图1所示的结构仅为示意,所述电子设备100还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。图1中所示的各组件可以采用硬件、软件或其组合实现。

可选地,所述电子设备100的具体类型不受限制,例如,可以是,但不限于,智能手机、个人电脑(personalcomputer,pc)、平板电脑、个人数字助理(personaldigitalassistant,pda)、移动上网设备(mobileinternetdevice,mid)、web(网站)服务器、数据服务器、电脑、移动上网设备(mobileinternetdevice,mid)等具有处理功能的设备。

结合图2,本发明实施例还提供一种可应用于上述电子设备100的类继承结构信息获取方法。其中,所述方法有关的流程所定义的方法步骤可以由所述处理器120实现。下面将对图2所示的具体流程进行详细阐述。

步骤s110,获取待分析类对象中的rtticompleteobjectlocator结构,访问所述rtticompleteobjectlocator结构以获得该结构中的pclasshierarchydescriptor字段。

在本实施例中,请参阅图3,可通过以下步骤获得待分析类对象中的rtticompleteobjectlocator结构:

步骤s111,获取待分析类对象的虚函数表的地址。

步骤s112,根据所述虚函数表的地址获得所述待分析类对象中的rtticompleteobjectlocator结构的地址。

步骤s113,查找所述rtticompleteobjectlocator结构的地址以获得所述rtticompleteobjectlocator结构。

在本实施例中,考虑到在c++语言中,若一个类具有虚函数,则该类具有一个虚函数表。并且,该虚函数表与对应的rtticompleteobjectlocator结构在地址上具有一定的关系。因此,可以通过获取虚函数表的表地址以获取对应的对象地址。其中,所述对象地址指向对应的rtticompleteobjectlocator结构。

在本实施例中,由于所述对象地址指向对应的rtticompleteobjectlocator结构,也就是说,所述rtticompleteobjectlocator结构的地址为所述对象地址。因此,可以通过所述对象地址查找到对应的rtticompleteobjectlocator结构。

其中,请参阅图4,在本实施例中,步骤s111可以包括以下子步骤:

步骤s1111,获取所述待分析类对象的起初地址。

步骤s1112,获得从所述起初地址开始的第一个4字节的整型值以得到所述待分析类对象具有的虚函数对应的虚函数表的地址。

在本实施例中,考虑到所述虚函数表可以位于所述类对象的起始地址位置,并且,所述表地址为所述起始地址中第一个4字节的整型值,因此,可以通过从待分析类对象的起初地址开始获得第一个4字节的整型值,该整型值所在的地址为虚函数表的地址。

在c++程序语言中,所述对象地址与所述虚函数表地址一般会存在一个固定的偏移量,因此,可以通过该偏移量对所述虚函数表地址进行地址偏移处理以得到所述对象地址。其中,所述偏移量可以为4,也就是说可以利用虚函数表地址减去4得到rtticompleteobjectlocator结构的地址。

进一步地,考虑到在c++语言中,一个类也有可能不具有虚函数表,因此,若直接执行步骤s111,难以有效地获取到虚函数表的表地址,可能会导致处理器120存在资源浪费以及进行死循环的问题,因此,在本实施例中,结合图5,在执行步骤s111之前,所述类继承结构信息获取方法还可以包括步骤s210和步骤s220。

步骤s210,检测所述待分析类对象中是否存在虚函数,若不存在虚函数,则执行以下步骤s220,若存在虚函数,则执行步骤s111。

步骤s220,生成虚函数表获取失败信息。

在本实施例中,在基于不存在虚函数表判定获取类名称失败时,可以及时终止处理器120进行程序的执行,进而避免造成资源浪费或进入死循环的问题。并且,还可以生成对应的通知信息,以通知开发人员。

基于与上述相同的考虑,若在程序的编译过程中未开启运行时信息,则在执行步骤s112时,难以根据所述虚函数表地址获得rtticompleteobjectlocator结构的地址,并进一步地导致处理器120存在资源浪费或进入死循环的问题,在本实施例中,结合图6,为避免上述问题,在执行步骤s111之后,所述类继承结构信息获取方法还可以包括步骤s310和步骤s320。

步骤s310,检测是否启用运行时信息,若未启用运行时信息,则执行以下步骤s320,若启用运行时信息,则执行步骤s112。

步骤s320,生成结构信息获取失败信息。

在本实施例中,所述运行时信息包括rtticompleteobjectlocator结构的信息。在基于未启用运行时信息判定获取失败时,可以及时终止处理器120进行程序的执行,进而避免造成资源浪费或进入死循环的问题。并且,还可以生成对应的获取失败信息,以通知开发人员。

本实施例中,所述rtticompleteobjectlocator结构包括5个字段,依次分别是,signature签名字段、offset字段、cdoffset字段、ptypedescriptor字段以及pclasshierarchydescriptor字段。本实施例中,在获得rtticompleteobjectlocator结构后,可找到其中的pclasshierarchydescriptor字段。

步骤s120,根据所述pclasshierarchydescriptor字段的指向信息获得rtticlasshierarchydescriptor结构,访问所述rtticlasshierarchydescriptor结构以获得该结构中的numbaseclasses字段以及pbaseclassarray字段。

步骤s130,根据所述numbaseclasses字段获得所述待分析类对象的基类的个数。

步骤s140,获得所述pbaseclassarray字段指向的rttibaseclassdescriptor结构体数组。

本实施例中,pclasshierarchydescriptor字段指向rtticlasshierarchydescriptor结构。本实施例中,可根据rtticlasshierarchydescriptor结构中的相关数据以获取到待分析类对象的完整继承结构信息。其中,rtticlasshierarchydescriptor结构一般包括四个字段,其第一个字段为32位整型的signature签名字段,第二个字段为32位整型的attribute字段,第三个字段为32位整型的numbaseclasses字段,第四个字段为一个指向结构为rttibaseclassdescriptor结构的pbaseclassarray指针字段。其中rttibaseclassdescriptor结构就记录了类的基类信息。而numbaseclasses字段指示了该类一共有多少个基类。

步骤s150,根据所述基类的个数依次访问所述rttibaseclassdescriptor结构体数组中的数组元素,以获得所述待分析类对象的所有基类的名称信息。

在本实施例中,请参阅图7,步骤s150包括以下子步骤:

步骤s151,根据获得的基类的个数访问所述rttibaseclassdescriptor结构体数组,以获得所述rttibaseclassdescriptor结构体数组中与所述个数一致的多个数组元素的每一个数组元素中的ptypedescritptor字段。

步骤s152,针对获得的每一项数组元素,获得所述数组元素中的ptypedescritptor字段所指向的typedescritptor结构。

步骤s153,访问所述typedescritptor结构以获得所述typedescritptor结构中的name字段,并获得所述name字段处的字符串中记录的该数组元素中的基类的名称信息,以获得所述待分析类对象的所有基类的名称信息。

其中,rttibaseclassdescriptor结构体数组中包括多个数组元素,针对每一个数组元素,其第一字段为一个指向typedescritptor结构的指针ptypedescritptor字段。找到所述typedescritptor结构中的name字段,所述name字段位置的字符串保存有所述该数组元素中的基类的基类名称,因此,可以通过获取位于所述name字段位置的字符串,以得到所述基类名称信息。其中,该结构体数组中保存有待分析类的名称信息,以及该待分析类的所有的基类的名称信息。

结合图8,本申请实施例还提供一种可应用于上述电子设备100的类继承结构信息获取装置110。其中,所述类继承结构信息获取装置110可以包括结构描述符字段获取模块111、基类信息获取模块112、个数获取模块113、数组获取模块114以及名称信息获取模块115。

所述结构描述符字段获取模块111用于获取待分析类对象中的rtticompleteobjectlocator结构,访问所述rtticompleteobjectlocator结构以获得该结构中的pclasshierarchydescriptor字段。在本实施例中,所述结构描述符字段获取模块111可用于执行图2所示的步骤s110,关于所述结构描述符字段获取模块111的具体描述可以参照前文对步骤s110的描述。

所述基类信息获取模块112用于根据所述pclasshierarchydescriptor字段的指向信息获得rtticlasshierarchydescriptor结构,访问所述rtticlasshierarchydescriptor结构以获得该结构中的numbaseclasses字段以及pbaseclassarray字段。在本实施例中,所述基类信息获取模块112可用于执行图2所示的步骤s120,关于所述基类信息获取模块112的具体描述可以参照前文对步骤s120的描述。

所述个数获取模块113用于根据所述numbaseclasses字段获得所述待分析类对象的基类的个数。在本实施例中,所述个数获取模块113可用于执行图2所示的步骤s130,关于所述个数获取模块113的具体描述可以参照前文对步骤s130的描述。

所述数组获取模块114用于获得所述pbaseclassarray字段指向的rttibaseclassdescriptor结构体数组。在本实施例中,所述数组获取模块114可用于执行图2所示的步骤s140,关于所述数组获取模块114的具体描述可以参照前文对步骤s140的描述。

所述名称信息获取模块115用于根据所述基类的个数依次访问所述rttibaseclassdescriptor结构体数组中的数组元素,以获得所述待分析类对象的所有基类的名称信息。在本实施例中,所述名称信息获取模块115可用于执行图2所示的步骤s150,关于所述名称信息获取模块115的具体描述可以参照前文对步骤s150的描述。

本申请实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器120执行时实现上述类继承结构信息获取方法的步骤。

综上所述,本申请实施例提供的类继承结构信息获取方法、装置及电子设备100,基于待分析类对象的rtticompleteobjectlocator结构以获取其中的pclasshierarchydescriptor字段。根据pclasshierarchydescriptor字段的指向信息获得rtticlasshierarchydescriptor结构,并进一步获得其中的numbaseclasses字段以及pbaseclassarray字段。根据numbaseclasses字段可获得待分析类对象的基类的个数,根据pbaseclassarray字段可获得保存基类名称信息的rttibaseclassdescriptor结构体数组。根据基类个数以及rttibaseclassdescriptor结构体数组以获得待分析类对象的所有基类的名称信息。如此,可快速、有效地获得待分析类对象的基类的名称信息,改善了现有技术中存在的基类名称获取不便的问题,提高了开发人员的开发效率。

在本申请所提供的实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1