解释内存数据块的数据结构的方法 技术领域
本发明属于通讯技术类,尤其涉及通讯技术分布式系统中对网络字节流数据进行解释的方法。
背景技术
目前,通讯技术中的数据结构定义是在程序的源代码中定义的,这是获取结构信息的最终来源。通常,在程序编译的时候,会生成一个非常复杂而庞大的符号表,它包含了所有变量、类型和函数的定义及作用域的信息。程序在调试时将会根据变量名(符号),到符号表中查找它的类型结构和内存地址,从而解释该变量在内存中的二进制数据。其实,一方面只有将程序编译成debug版本(即将符号表编入执行文件),才能通过变量名找到变量的内存地址和类型结构,而这样的话执行文件必会庞大,而且效率也会很低。另一方面,就算把程序编译成Release版本(不含符号表),而通过其他手段(如按中国专利CN1286431A中所述的方法脱离调试环境,直接读取符号表信息),以获取某变量的内存地址和类型结构,从而获取内存数据并进行解释。这样虽然可以通过变量名进行调试,但是在不知道变量名的情况下,想解释一块内存数据、符号表及其依赖符号表的相关技术就显得无能为力了。还有一方面,符号表对内存数据地解释是针对各个成员变量的,虽然它能给出每个成员变量的值,但对那些数据结构很复杂的大结构,成员变量非常多,符号表不能给出每个成员变量的实际意义,所以查看起来还是很费力,这对解释内存数据是不尽人意的。
在通讯技术领域,或者与其他数据处理密切相关的领域中所涉及的程序,通常会分配一些很大的数据区,这些数据区也许并没有变量名和它对应,所以通常的调试器不能对这些数据区进行解释。但这些数据区的内容却是非常重要的,一旦有故障发生,开发人员最关心,同时能最快定位错误的切入点就是这些数据区。所以,如果不能对这些庞大的数据区作出很有效的解释,将会给故障定位和解决带来巨大的困难。
发明内容
本发明的目的是提供一种解释内存数据块的数据结构的方法,解决上述难题,以满足对内存数据进行解释,及时确定故障定位,快速解决通讯故障等多方面的需要。
本发明的目的是这样实现的:一种解释内存数据块的数据结构的方法,包括下列步骤:
1,由结构分析器分析源文件,生成类型结构的描述文件,并存放在解释内存数据进程所在的主机上。
2,获取内存数据块的字节流数据,选择与该内存数据块对应的结构描述文件,并生成一个结构树,和显示该内存数据块每个字节的意义,从而解释该内存数据块。
由于本发明采用了以上的技术方案,因而具有以下的优点:
1,直接从源文件获取信息,所以开发人员修改结构定义或版本变化都不会影响这种解释的正确性。
2,由开发人员在定义结构时对每个成员变量的作用进行注释,这些注释信息作为成员变量属性表的一部分,也将写入结构描述文件,从而在结构树中同样可以得到,这样就更加有利于维护人员对各个变量的理解,这是现有技术中的符号表不能实现的。
3,由于结构描述文件放弃了源文件中许多与结构无关的信息,使得它非常的小巧。而且,由于结构描述文件采用的数据存储方式本身就是树型结构,而不同于符号表的表结构,这样就省去了查找哈希表所花的时间,大大提高了生成结构树的效率。
4,本发明能够对内存数据进行解释,而不需要关心该内存数据有没有变量名和它对应,也不需要该程序是Release版本,完全摆脱符号表的限制,只需要知道该内存数据是与哪种结构对应即可。而且在得到每个成员变量的值时还可以得到它的实际意义。所以,本发明的方法是对现有符号表技术及其调试技术的一个重要改进和提高。
附图说明
图1是本发明的一种从描述文件还原结构树的流程示意图;
图2是本发明的一种从源文件获取结构信息的流程示意图。
具体实施方式
以下结合附图对本发明的实施作如下详述:
在图1中,本发明由结构分析器分析源文件,生成类型结构的描述文件,并存放在解释内存数据进程所在的主机上。其内存数据块可以是本机的内存数据块;也可以是其他主机上的内存数据块。其他主机上的内存数据块是在所在的主机上设置一个代理模块,负责将那台主机中的内存数据发送给本机。
此步骤又可以分成以下几个步骤来实现:
1,获取与该结构相关的所有头文件。
2,读取这些头文件,将其中定义的所有结构(只分析结构类型及其成员变量,如C语言中的Struct类型,C++和Java中的Class类型)放进一个列表中,每个结构又对应了一张它的成员变量的列表,这样就拥有了所有结构的信息。
3,以所需创建的结构为起点,分析它的每个成员变量,生成成员变量的属性表(包括离结构起点的偏移量,类型,长度,作用(变量的注释),名称,维数等),如果成员变量也是结构类型,则继续分析它所对应的结构。在每分析一个成员变量时,都将它的属性表写入结构描述文件中,直到所需创建的那个结构分析结束。
其具体执行程序的步骤如下:
1,打开描述文件读取文件头中的结构描述注释,步骤101,并以此作为节点名创建根节点,步骤102,同时将当前节点压入堆栈作为下面节点的父节点,步骤103,并对文件中读取下一个变量属性表作判断,步骤104;
2,对文件中读取下一个变量属性表的结果作判断,是否讀取失敗,步骤105
若失败,则退出,步骤106,
若成功,则按照变量属性表的内容在上一层节点中添加叶子节点,和将该节点和变量属性表绑定,步骤107,并作结构的判断,步骤108;
3,对结构作判断,
若是,则将当前节点压入堆栈作为下面节点的父节点的程序,步骤109,
若否,则对是否结构的最后一个变量作判断,步骤110;
4,对是否结构的最后一个变量作判断,
若否,则返回对文件中读取下一个变量属性表作判断的程序步骤,即返回步骤104
若是,则将当前父节点退出堆栈,步骤111,并返回对文件中读取下一个变量属性表作判断的程序,即返回步骤104。
在图2中,本发明从源文件获取结构信息,从而解释该内存数据块,其具体执行程序的步骤如下:
1,如果有新行则处理新行,如果没有则读取下一行,步骤201;并对文件是否结束作判断,步骤202;
2,对文件是否结束作判断,
若是,则退出,步骤213,
若否,则裁剪注释部分(保留变量定义后的注释)重新组成一行,步骤203,并作是否常量定义的判断,步骤204;
3,对是否常量定义作判断,
若是,则将常量和它的值加入哈希表,步骤205,返回如果有新行则处理新行,如果
若否,则作是否结构定义开始的判断,步骤206;
4,对是否结构定义开始作判断,
若是,则压入堆栈,生成lstVar作为当前变量列表,和将lstVar及结构名压入哈希表hsStruct备查,步骤207,并返回如果有新行则处理新行,如果没有则读取下一行的程序步骤,步骤201;
若否,则对是否结构定义结束作判断,步骤208;
5)对是否结构定义结束作判断,
若是,则弹出堆栈,步骤211,将变量和结构名称加入当前结构对应的变量列表,步骤212,并返回如果有新行则处理新行,如果没有则读取下一行的程序步骤,步骤201,
若否,则对是否变量定义作判断,步骤209;
6)对是否变量定义作判断,
若否,则返回如果有新行则处理新行,如果没有则读取下一行的程序步骤,步骤201,
若是,则将变量名称和变量属性表加入当前哈希表,步骤210,并返回如果有新行则处理新行,如果没有则读取下一行的程序步骤,步骤201。
由上所述,本发明在生成结构描述文件时,应首先设置一个字节计数器,以内存数据块对应的结构为起点,每处理一个成员变量,字节计数器就增加相应的长度,这样,每个成员变量在内存数据块中的位置就是当前的字节计数器的值,把它写入变量的属性表中,同时通过分析变量名的特征来确定该变量是否是位变量,或者是数组,然后把这些属性也添加到属性表中,写入结构描述文件。总之,变量的属性越多,在结构描述文件中得到的信息也就越多。
接着,本发明从源文件获取结构信息,即结构分析器,由它分析源文件中的语法现象。这些语法包括包含注释,编译预处理,常量定义,变量定义,类型定义(结构定义),函数定义。在变量定义中又有位定义,数组定义,指针定义等特殊语法,这些语法都将得到支持。
当读入一行后,先去除注释部分(保留变量定义后的注释),对新的一行进行结构分析,判断该行是否是常量定义,或是类型定义(结构定义),或是变量定义。如果不是则跳过;如果是常量定义,则将该常量和它代表的值加入哈希表中备查。如果是类型定义(结构定义)开始则压入堆栈,同时生成一个列表lstVar作为当前变量列表,并将lstVar和结构名(如果没有结构名称则自动生成一个)压入哈希表hsStruct备查。如果是类型定义(结构定义)结束,则弹出堆栈,判断如果用该结构定义了变量,则将该变量和结构名称加入当前结构对应的变量列表。如果是变量定义,则将当前变量属性表加入当前变量列表lstVar,(变量属性表包括类型,长度,名称和注释)。这样,搜索完所有的源文件后,将得到一个含有所有结构的哈希表(Key=结构名称,Value=含有所有成员变量的列表lstVar),通过结构名称就可以得到该结构的所有成员变量的信息。
由此,本发明中设置的结构树是根据结构描述文件生成的,它的每个叶子节点都代表结构的一个成员变量。如果结构中有嵌套,该节点将由许多子节点构成,每个子节点代表子结构的各个成员变量,依此类推。每一个节点或字节点都绑定了它所对应的成员变量的属性表。在生成树的过程和对内存数据块的各个字节进行解释的过程是同步完成的,即每生成一个节点,该节点对应的内存数据就被读取并解释了。一旦结构树生成后,就可以从字节流中的字节定位结构的成员变量,也可以从结构的成员变量定位字节流的某段字节,以满足对内存数据进行解释,及时确定故障定位,快速解决通讯故障等方面的需要。
本发明经在中兴通讯ZXSS10后台数据维护终端的探针模块样机上试验,取得极好的效果。其探针模块向前台发送消息,请求获取前台内存中的数据。在前台,有个探针代理模块,响应探针模块的请求,把前台内存中的数据传送到后台。当探针获取前台内存中的原始字节流数据后,利用已经生成的和前台的数据结构对应的结构描述文件来生成结构树,使字节流中的每个字节都能在结构树中找到相应的变量与之对应。反之亦然,随意选取结构树的某个节点(即某个成员变量),都能在字节流中进行定位,并能得到更详尽的与该变量相关的信息(属性)。例如,呼叫数据区里保存了与一次通话相关的所有信息,它其实是一个很大的数据结构,通过这种方法可以知道呼叫数据区(该结构)的所有成员变量的值及其功能。如果通话出现了问题,查看该结构就可以帮助开发人员或维护人员迅速定位错误。这样,可以使调试或维护所花的时间大大缩短,提高了工作效率。
本发明应用于电信设备中的优点是很明显的。但是,它的应用远不限于此。任何一个应用,只要能获取内存数据块,并且知道它的结构,就可以利用本发明来对内存数据块进行解释,其都在本发明所要求保护的范围内。