CN107943520A - 应用堆栈信息获取方法及装置、堆栈信息解析方法及装置 - Google Patents
应用堆栈信息获取方法及装置、堆栈信息解析方法及装置 Download PDFInfo
- Publication number
- CN107943520A CN107943520A CN201610891656.6A CN201610891656A CN107943520A CN 107943520 A CN107943520 A CN 107943520A CN 201610891656 A CN201610891656 A CN 201610891656A CN 107943520 A CN107943520 A CN 107943520A
- Authority
- CN
- China
- Prior art keywords
- file
- memory
- information
- stack
- symbol table
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30145—Instruction analysis, e.g. decoding, instruction word fields
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Debugging And Monitoring (AREA)
Abstract
一种应用堆栈信息获取方法及装置、一种堆栈信息解析方法及装置,该应用堆栈信息获取方法包括步骤:获取当前堆栈的内存偏移信息,所述内存偏移信息包括函数地址和PC偏移值,根据获取的内存偏移信息生成内存偏移结构存储文件;获取虚拟内存和磁盘文件的映射关系,根据所述映射关系记录映射信息,生成内存映射结构存储文件,记录的所述映射信息包括虚拟内存地址范围、内存文件偏移量、以及文件路径;将所述内存偏移结构存储文件、所述内存映射结构存储文件进行存储。本发明实施例方案,在获取应用堆栈信息时,可以大大减少存储量,使得堆栈信息占用了尽量少的内存,在应用到应用信息跟踪中时能够以最小的性能损耗获取堆栈的跟踪采样。
Description
技术领域
本发明涉及网络信息处理领域,特别是涉及一种应用堆栈信息获取方法以及一种应用堆栈信息获取装置、一种堆栈信息解析方法以及一种堆栈信息解析装置。
背景技术
目前在需要采集堆栈的信息时,一般都是通过dvm的native函数dvmFillInStackTraceInternal或者系统标准的java函数Throwable::fillInstackTrace来获取堆栈信息,得到的堆栈为相应的堆栈字符串内容。
这种堆栈获取方法可以正确地获取堆栈信息,然而,由于堆栈是显示为纯文本信息,一层堆栈信息平均要在60字节左右,如果该堆栈深度为16层,那么该堆栈占用的内存大小就要到达1k,随着堆栈深度的增加,所占用的内存也会持续增加。
发明内容
基于此,本发明实施例提供一种应用堆栈信息获取方法以及一种应用堆栈信息获取装置、一种堆栈信息解析方法以及一种堆栈信息解析装置,以使得堆栈信息占用尽量少的内存,从而能够在应用到应用信息跟踪中时以最小的性能损耗获取堆栈的跟踪采样。
为达到上述目的,本发明实施例采用以下技术方案:
一种应用堆栈信息获取方法,包括步骤:
获取当前堆栈的内存偏移信息,所述内存偏移信息包括函数地址和PC偏移值,根据获取的内存偏移信息生成内存偏移结构存储文件;
获取虚拟内存和磁盘文件的映射关系,根据所述映射关系记录映射信息,生成内存映射结构存储文件,记录的所述映射信息包括虚拟内存地址范围、内存文件偏移量、以及文件路径;
将所述内存偏移结构存储文件、所述内存映射结构存储文件进行存储。
一种堆栈信息解析方法,包括步骤:
获取记录内存偏移信息的内存偏移结构存储文件、记录映射信息的内存映射结构存储文件,所述内存偏移信息包括函数地址和PC偏移值,所述映射信息包括虚拟内存地址范围、内存文件偏移量、以及文件路径;
获取记录文件符号表结构信息的文件符号表结构文件,所述文件符号表结构信息包括函数代码执行的起始位置、函数信息以及调试信息,所述调试信息包括PC相对起始位置对应的代码行号;
根据所述文件路径从所述文件符号表结构文件中获取对应的文件符号表结构信息,通过所述函数地址、虚拟内存地址范围、内存文件偏移量将所述函数地址转换为磁盘文件地址,并用所述磁盘文件地址在获取的所述文件符号表结构信息中查找到对应的函数信息和调试信息,并根据所述PC偏移值在该调试信息中查找到对应的代码行,获得解析后的堆栈信息。
一种应用堆栈信息获取装置,包括:
内存偏移获取模块,用于获取当前堆栈的内存偏移信息,所述内存偏移信息包括函数地址和PC偏移值,根据获取的内存偏移信息生成内存偏移结构存储文件;
内存映射获取模块,用于获取虚拟内存和磁盘文件的映射关系,根据所述映射关系记录映射信息,生成内存映射结构存储文件,记录的所述映射信息包括虚拟内存地址范围、内存文件偏移量、以及文件路径;
存储模块,用于将所述内存偏移结构存储文件、所述内存映射结构存储文件进行存储。
一种堆栈信息解析装置,包括:
内存信息相关文件获取模块,用于获取记录内存偏移信息的内存偏移结构存储文件、记录映射信息的内存映射结构存储文件,所述内存偏移信息包括函数地址和PC偏移值,所述映射信息包括虚拟内存地址范围、内存文件偏移量、以及文件路径;
文件符号表获取模块,用于获取记录文件符号表结构信息的文件符号表结构文件,所述文件符号表结构信息包括函数代码执行的起始位置、函数信息以及调试信息,所述调试信息包括PC相对起始位置对应的代码行号;
解析模块,用于根据所述文件路径从所述文件符号表结构文件中获取对应的文件符号表结构信息,通过所述函数地址、虚拟内存地址范围、内存文件偏移量将所述函数地址转换为磁盘文件地址,并用所述磁盘文件地址在获取的所述文件符号表结构信息中查找到对应的函数信息和调试信息,并根据所述PC偏移值在该调试信息中查找到对应的代码行,获得解析后的堆栈信息。
根据如上所述的本发明实施例的方案,其在获取应用堆栈信息时,只需要获取函数地址和PC偏移值,内存偏移结构存储文件中可以只存储函数地址和PC偏移值,相对于现有的文本存储堆栈信息的方式,可以大大减少存储量,而内存映射结构存储文件有助于虚拟内存到磁盘文件的映射和信息跟踪,从而使得堆栈信息占用了尽量少的内存,在应用到应用信息跟踪中时能够以最小的性能损耗获取堆栈的跟踪采样。
附图说明
图1是一个实施例中的本发明方案的应用环境的示意图;
图2是一个实施例中的终端的结构示意图;
图3是一个实施例中的后台服务器的结构示意图;
图4是一个实施例中的应用堆栈信息获取方法的流程示意图;
图5是一个实施例中的堆栈信息解析方法的流程示意图;
图6是一个具体示例中的获取堆栈信息时建立的数组的结构示意图;
图7是本发明一个具体示例中存储获取的函数地址和PC偏移值的代码结构示意图;
图8是本发明一个具体示例中的获取的函数地址和PC偏移值的存储结构的示意图;
图9是一个具体示例中的虚拟内存映射关系的示意图;
图10是一个具体示例中的获取到的映射信息的代码结构示意图;
图11是基于图10所示示例的存储的文件的结构示意图;
图12是一个具体示例中的dex文件的结构示意图;
图13是图12所示的dex文件的详细结构示意图;
图14是一个具体示例中的确定行号的流程示意图;
图15是一个实施例中的应用堆栈信息获取装置的结构示意图;
图16是一个实施例中的堆栈信息解析装置的结构示意图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步的详细说明。应当理解,此处所描述的具体实施方式仅仅用以解释本发明,并不限定本发明的保护范围。
图1示出了本发明一个实施例中的工作环境示意图,如图1所示,其工作环境涉及终端101以及后台服务器102,终端101与后台服务器102可以通过网络进行通信。终端101可以获得相关的应用堆栈信息,获得的应用堆栈信息可以存储在终端101本地,存储后的应用堆栈信息可以发送给后台服务器102,由后台服务器102进行堆栈信息的解析。当然,在一些实施例中,存储后的应用堆栈信息也可以由终端101在后续过程中自行进行解析。
终端101在一个实施例中的结构示意图如图2所示。该终端101包括通过系统总线连接的处理器、存储介质、通信接口、电源接口和内存。其中,终端101的存储介质存储有一种应用堆栈信息获取装置,该装置用于实现一种应用堆栈信息获取方法。终端101的通信接口用于与服务器102连接和通信,终端101的电源接口用于与外部电源连接,外部电源通过该电源接口向终端101供电。终端101可以是任何一种能够实现智能输入输出的设备,例如移动终端,比如手机、平板电脑等;个人计算机等等,也可以是其它具有上述结构的设备。
后台服务器102在一个实施例中的结构示意图如图3所示。其包括通过系统总线连接的处理器、供电模块、存储介质、内存和通信接口。其中,服务器的存储介质存储有操作系统、数据库和一种堆栈信息解析装置,该装置用于实现一种堆栈信息解析方法。服务器的通信接口用于与终端101进行连接和通信。
图4中示出了一个实施例中的应用堆栈信息获取方法的流程示意图。如图4所示,该实施例中的应用堆栈信息获取方法包括:
步骤S401:获取当前堆栈的内存偏移信息,所述内存偏移信息包括函数地址和PC偏移值,根据获取的内存偏移信息生成内存偏移结构存储文件;
步骤S402:获取虚拟内存和磁盘文件的映射关系,根据所述映射关系记录映射信息,生成内存映射结构存储文件,记录的所述映射信息包括虚拟内存地址范围、内存文件偏移量、以及文件路径;
步骤S403:将所述内存偏移结构存储文件、所述内存映射结构存储文件进行存储。
根据如上所述的本发明实施例的方案,其在获取应用堆栈信息时,只需要获取函数地址和PC偏移值,内存偏移结构存储文件中可以只存储函数地址和PC偏移值,相对于现有的文本存储堆栈信息的方式,可以大大减少存储量,而内存映射结构存储文件有助于虚拟内存到磁盘文件的映射和信息跟踪,从而使得堆栈信息占用了尽量少的内存,在应用到应用信息跟踪中时能够以最小的性能损耗获取堆栈的跟踪采样。
在一个具体示例中,上述记录的映射信息还可以包括文件节点号。从而,在基于映射结构存储文件进行信息跟踪时,可以通过文件节点号快速定位到相应的文件,提高堆栈信息解析的效率。
在另一个具体示例中,在上述记录映射信息时,可以是在堆栈信息采集结束时,采集满足预设条件的dex文件的映射数据,从所述映射数据中获得并记录所述映射信息。即在采集记录映射信息时可以进行过滤,过滤去除不关心的映射关系,以使得内存和最终存储所占用的空间最小,提高内存的应用性能。
在一个具体示例中,在上述获取内存偏移信息时,可以是从获取堆栈信息时建立的stackInfo数组中获取所述PC偏移;并将获取堆栈信息时建立的stackInfo数组的method指针指向的Method类的结构类型中的insns的值,确定为所述函数地址。
在上述将内存偏移结构存储文件、内存映射结构存储文件进行存储时,可以是将上述内存偏移结构存储文件、内存映射结构存储文件压缩后再进行存储。存储的内存偏移结构存储文件、内存映射结构存储文件,可以发送给后台服务器,由后台服务器根据所述内存偏移结构存储文件、所述内存映射结构存储文件进行堆栈信息解析。
图5中示出了一个实施例中的堆栈信息解析方法的流程示意图,如图5所示,该实施例中的堆栈信息解析方法包括:
步骤S501:获取记录内存偏移信息的内存偏移结构存储文件、记录映射信息的内存映射结构存储文件,所述内存偏移信息包括函数地址和PC偏移值,所述映射信息包括虚拟内存地址范围、内存文件偏移量、以及文件路径;
步骤S502:获取记录文件符号表结构信息的文件符号表结构文件,所述文件符号表结构信息包括函数代码执行的起始位置、函数信息以及调试信息,所述调试信息包括PC相对起始位置对应的代码行号;
步骤S503:根据所述文件路径从所述文件符号表结构文件中获取对应的文件符号表结构信息,通过所述函数地址、虚拟内存地址范围、内存文件偏移量将所述函数地址转换为磁盘文件地址,并用所述磁盘文件地址在获取的所述文件符号表结构信息中查找到对应的函数信息和调试信息,并根据所述PC偏移值在该调试信息中查找到对应的代码行,获得解析后的堆栈信息。
基于如上所述的实施例,其在进行解析时,所针对的获取到的堆栈信息只包含函数地址和PC偏移值,解析时所针对的数据量相对于现有的文本存储堆栈信息的方式大大减少存储量,结合内存映射结构存储文件有助于虚拟内存到磁盘文件的映射和信息跟踪,同时结合文件符号表结构文件可以顺利便捷地实现对堆栈信息的解析,从而能够以最小的性能损耗获取堆栈的跟踪采样。
在一个实施例中,上述映射信息还可以包括文件节点号;此时,在上述根据所述文件路径从所述文件符号表结构文件中获取对应的文件符号表结构信息时,可以结合所述文件节点号获取对应的文件符号表结构信息。从而可以通过文件节点号快速定位到相应的文件,提高堆栈信息解析的效率。
其中,在一个具体示例中,上述函数信息具体可以包括文件名、类名、函数名,以便于解析到具体的代码行。
在另一个具体示例中,上述内存偏移结构存储文件、内存映射结构存储文件可以是从前端应用终端接收获得,即是从终端接收到上述内存偏移结构存储文件、内存映射结构存储文件。
基于如上所述的实施例,以下结合一个具体的从获取应用堆栈信息、对堆栈信息进行解析的过程进行举例说明。本领域技术人员可以理解的是,这里的举例说明仅仅是为了便于理解的示例性说明,并不用以对本发明方案构成限定。
如上所述,在获取应用堆栈信息的过程中,需要获取堆栈的内存偏移信息,该内存偏移信息包括函数地址和PC偏移值。
以Android系统为例,在Android4.4之前的代码中,基于native层的dvmFillInStackTraceInternal函数的实现,可以确定,在获取堆栈信息时候会建立一个宽度为2深度为stackDepth(堆栈深度)的数组(stackInfo数组)。该数组的第一列为一个指向Method对象的指针,第二列为当前pc指针相对于函数实际地址的偏移(如果是native函数的话为0),其相关的结构类似于图6所示,因此,可以从图6中所示的数组结构中获取pc偏移值。
而method指针指向的是Method类的结构类型,一个具体应用示例中的Method类可如下所示。
可见,由于method指针指向的是Method类的结构类型,因此,可以从该结构类型中获取到其insns值,该值表示该函数入口地址在内存中的位置。
从而,通过记录insns值(即上述函数地址)以及PC偏移值,就可以在后续操作过程中通过符号表找到对应的函数名以及所在文件对应的行号。因此,在一个具体应用示例中,存储获取的函数地址和PC偏移值的代码结构示意图如图7所示,获取的函数地址和PC偏移值的存储结构的示意图可如图8所示。
结合图6、图7、图8可见,本发明实施例中的关于获取的函数地址和PC偏移值的存储结构,可以只需要存储insns值和pc偏移值,通过insns可以确定一个函数的起始位置,也就可以确定一个函数的函数名;通过pc偏移值可以确定函数当前执行的行号。
图8所示的存储结构中,stack_node_struct用以存储堆栈的其中一层的函数地址和PC偏移值,基于图8所示的存储结构,如果一个堆栈有n层(Depth),那么就有n个对应的stack_node_struct,以一个堆栈有16层为例,一个深度为16的堆栈信息只需要存储38个字节(其中stack_node_head_struct 6字节,一个stack_node_struct 2字节,堆栈内容共计2*16=32字节),远远小于纯文本的1k字节的存储。上述存储结构存储的信息,可以存储在内存偏移结构存储文件中,例如可以将该内存偏移结构存储文件命名为stack.dat。
然后,即可获取虚拟内存和磁盘文件的映射关系,根据所述映射关系记录映射信息,生成内存映射结构存储文件。
以Android系统为例,由于android底层是使用到linux操作系统,从而可以据此获得虚拟内存和磁盘文件的映射关系,例如通过/proc/pid/maps(pid为对应进程的进程id,例如/proc/1122/maps),就可以取到对应的一个虚拟内存映射关系,图9中示出了基于此获得的虚拟内存映射关系的示意图。
如图9所示,该文件信息共有6列,分别为:
虚拟内存地址范围(例如图9中所示的54423000-54506000),用以表示库在进程里的地址范围;
权限(例如图9中所示的r—p、r-xp、rw-p),用以表示虚拟内存的权限,其中r=读,w=写,x=,s=共享,p=私有;
文件偏移量(例如图9中所示的000e3000),用以表示内存区块起始地址对应的文件偏移;
设备(例如图9中所示的b3:1e),表示映像文件的主设备号和次设备号;
节点号(例如图9中所示的363104),表示映像文件的节点号;
文件路径(例如图9中所示的/system/lib/libqdutils.so),表示映像文件的路径。
在图9中所示的虚拟内存映射关系中,本发明实施例可以主要关注:虚拟内存地址范围、文件偏移量、文件路径。主要关注的对象还可以包括有文件节点号。以关注的对象包括虚拟内存地址范围、文件偏移量(即上述图4所示实施例中的内存文件偏移量)、节点号、文件路径为例,一个具体应用示例中设计的存储结构的代码可如图10所示,在此基础上得到的存储的文件的结构示意图如图11所示。
在图10、图11所示中,maps_struct的offest存储文件偏移量,min存储对应虚拟内存块的起始位置,max存储对应的虚拟内存块的结束位置。Item_map_struct的file_name存储文件路径,node_num存储文件节点号。
其中,在上述采集和记录映射关系时,可以是在堆栈信息采集结束时,采集满足预设条件的dex文件的映射数据,从所述映射数据中获得并记录所述映射信息。即该映射信息的采集可以只在所有堆栈采集结束后采集一次,并且在采集时候可以做适当的过滤,对于不关心的so文件或者dex文件的映射数据可以过滤去除,以保证内存和最终存储占用的空间最小。
上述获得的映射信息的存储结构,可以存储在内存映射结构存储文件,在一个具体应用示例中,可以将该内存映射结构存储文件命名为vmmap.dat。
上述获得的内存偏移结构存储文件(如上述示例中的stack.dat)以及内存映射结构存储文件(如上述示例中的vmmap.dat)可以进行存储。为了保证存储的文件占用空间较小,还可以对内存偏移结构存储文件和内存映射结构存储文件压缩后进行存储,具体的压缩方式可以采用任何可能的方式进行。以ZIP压缩为例,通过zip压缩对文件stack.dat和文件vmmap.dat压缩后,可以获得一个stackdata.zip的压缩文件。压缩后的空间占用只要30.8k字节,相对于进行文本存储时需要占用10M以上的磁盘空间,可以大大的节省存储空间。
上述压缩后获得的文件,可以发送给后台服务器,由后台服务器进行堆栈信息的解析。
对后台服务器而言,其在进行解析时,需要知晓文件符号表结构信息,该文件符号表结构信息可以是在接收到终端发送的内存偏移结构存储文件和内存映射结构存储文件(或者上述压缩后的文件)后进行,也可以是事先进行,只要是在最后进行解析时能够有文件符号表结构信息即可。
在获取文件符号表结构信息时,以Android系统为例,可以是基于dex文件进行,图12中示出了一个具体示例中的dex文件的结构示意图,图13中示出了该dex文件的详细结构示意图。
结合图12、图13所示的示意图,在获取文件字符表结构信息时,一个具体示例中的过程可以是如下所述。
首先遍历dex相关的DexStringId,获取所有的字符串相关信息,建立一个id和实际字符串的map信息,用于后续查询。然后遍历这个dex文件的类结构(即DexClassData),通过结构之间的关联关系,可以进一步得到各个类所包含的方法,通过方法的调试结构,可以得到这个方法的执行代码的起始位置(DexMethod的codeOff的值),然后进一步根据methodidx解析出这个方法的方法名和所属的类名以及所在的文件,然后解析出debug_info_item的debug_opcode中的调试信息(该调试信息包含了相对于这个函数code起始地址偏移的位置对应的代码行号,即pc相对起始位置对应的代码行号)。这样我们可以得到一个map结构,该map结构的key为方法代码执行的起始地址,value包含函数信息和调试信息,该函数信息包括文件名、类名、方法名和调试信息。一个具体应用示例中的相关代码可如下所示:
设计的map结构对应的信息可以为:
Key:codebegin
Value:functionInfo。
获得的文件符号表结构信息可以存储在文件符号表结构文件中。
如上所述,由于上述内存偏移结构存储文件中存储的信息是存储中的信息,而文件符号表结构文件中存储的是磁盘文本中的信息,因而需要通过上述内存映射结构存储文件的信息将内存中的偏移信息转为磁盘偏移信息。
具体应用时,可以根据所述文件路径从所述文件符号表结构文件中获取对应的文件符号表结构信息,通过所述函数地址、虚拟内存地址范围、内存文件偏移量将所述函数地址转换为磁盘文件地址,并用所述磁盘文件地址在获取的所述文件符号表结构信息中查找到对应的函数信息和调试信息,并根据所述PC偏移值在该调试信息中查找到对应的代码行,获得解析后的堆栈信息。
在一个具体应用示例中,假设有一条堆栈信息为(2100,6),其中2100和6分别表示上述提及的函数地址(即函数入口地址)和PC偏移值(函数当前的执行地址),即2100和6分别表示stack_node_struct结构的函数入口偏移和当前pc相对入口的偏移。以2100作为检索条件,在内存映射表中进行检索,可以发现可以存在一个内存映射块为test.dex这个文件,其虚拟内存地址范围为2000-3000(2100在该区间内),而对应的文件块的起始偏移(即上述内存文件偏移量)为1000。从而可以得到函数起始地址相对于该内存块的起始地址的偏移为2100-2000=100。那么函数起始地址相对于文件的偏移为1000+100=1100。据此可以将内存的(2100,6)转为磁盘的(1100,6),即2100在内存中的位置相对于文件中的1100偏移的位置。然后用1100做索引在磁盘数据中进行检索,即在上述文件符号表结构文件的map结构的key-value对中找相关的函数(即对上述test.dex文件的解析结果查找,如果存在多个dex,那么根据内存映射区间对应的dex进行解析处理),找到对应的文件名、类型、函数名以及调试信息,然后用(1100,6)中的偏移值6在调试信息中查找,看是否有命中对应的代码行,在查找到命中的代码行时,从而获得解析后的堆栈信息。
图14示出了基于该示例的一个具体应用示例中的确定代码行行号的流程示意图,结合图14所示,可以确定,假设存在偏移的映射信息为(1,1220)(3,1221)(5,1226),如果偏移是0,则么对应的行号是1220;如果偏移是3,则对应的行号是1221;如果偏移为4,则对应的行号也是1221;如果偏移是10,则对应的行号为1226。
其中,在上述对堆栈信息进行解析的过程中,可以是在查找到文件名后,先基于文件名(或者上述文件节点号)确定是否已有该文件的堆栈解析信息,若已有,则可以直接提取该文件的堆栈解析信息,若没有,再采用上述方式进行堆栈解析。在对某个文件的堆栈进行解析后,可以将该文件标志为已解析。
基于与上述方法相同的思想,本发明实施例还提供一种应用堆栈信息获取装置以及一种堆栈信息解析方法。
图15示出了一个实施例中的应用堆栈信息获取装置的结构示意图。如图15所示,该实施例中的应用堆栈信息获取装置包括:
内存偏移获取模块1501,用于获取当前堆栈的内存偏移信息,所述内存偏移信息包括函数地址和PC偏移值,根据获取的内存偏移信息生成内存偏移结构存储文件;
内存映射获取模块1502,用于获取虚拟内存和磁盘文件的映射关系,根据所述映射关系记录映射信息,生成内存映射结构存储文件,记录的所述映射信息包括虚拟内存地址范围、内存文件偏移量、以及文件路径;
存储模块1503,用于将所述内存偏移结构存储文件、所述内存映射结构存储文件进行存储。
根据如上所述的本发明实施例的方案,其在获取应用堆栈信息时,只需要获取函数地址和PC偏移值,内存偏移结构存储文件中可以只存储函数地址和PC偏移值,相对于现有的文本存储堆栈信息的方式,可以大大减少存储量,而内存映射结构存储文件有助于虚拟内存到磁盘文件的映射和信息跟踪,从而使得堆栈信息占用了尽量少的内存,在应用到应用信息跟踪中时能够以最小的性能损耗获取堆栈的跟踪采样。
在一个具体示例中,上述记录的映射信息还可以包括文件节点号。从而,在基于映射结构存储文件进行信息跟踪时,可以通过文件节点号快速定位到相应的文件,提高堆栈信息解析的效率。
在另一个具体示例中,内存映射获取模块1502可以在堆栈信息采集结束时,采集满足预设条件的dex文件的映射数据,从所述映射数据中获得并记录所述映射信息。即在采集记录映射信息时可以进行过滤,过滤去除不关心的映射关系,以使得内存和最终存储所占用的空间最小,提高内存的应用性能。
在一个具体示例中,内存偏移获取模块1501可以是从获取堆栈信息时建立的stackInfo数组中获取所述PC偏移;将获取堆栈信息时建立的stackInfo数组的method指针指向的Method类的结构类型中的insns的值,确定为所述函数地址。
上述存储模块1503在将内存偏移结构存储文件、内存映射结构存储文件进行存储时,可以是将上述内存偏移结构存储文件、内存映射结构存储文件压缩后再进行存储。
如图15所示,在一个具体示例中,该实施例中的装置还可以包括文件上传模块1504,用于将存储的所述内存偏移结构存储文件、所述内存映射结构存储文件向后台服务器发送,由后台服务器根据所述内存偏移结构存储文件、所述内存映射结构存储文件进行堆栈信息解析。可以理解的是,文件上传模块1504上传的文件,是存储模块1503存储的文件。
图16示出了一个实施例中的堆栈信息解析装置的结构示意图。如图16所示,该实施例中的堆栈信息解析装置包括:
内存信息相关文件获取模块1601,用于获取记录内存偏移信息的内存偏移结构存储文件、记录映射信息的内存映射结构存储文件,所述内存偏移信息包括函数地址和PC偏移值,所述映射信息包括虚拟内存地址范围、内存文件偏移量、以及文件路径;
文件符号表获取模块1602,用于获取记录文件符号表结构信息的文件符号表结构文件,所述文件符号表结构信息包括函数代码执行的起始位置、函数信息以及调试信息,所述调试信息包括PC相对起始位置对应的代码行号;
解析模块1603,用于根据所述文件路径从所述文件符号表结构文件中获取对应的文件符号表结构信息,通过所述函数地址、虚拟内存地址范围、内存文件偏移量将所述函数地址转换为磁盘文件地址,并用所述磁盘文件地址在获取的所述文件符号表结构信息中查找到对应的函数信息和调试信息,并根据所述PC偏移值在该调试信息中查找到对应的代码行,获得解析后的堆栈信息。
基于如上所述的实施例,其在进行解析时,所针对的获取到的堆栈信息只包含函数地址和PC偏移值,解析时所针对的数据量相对于现有的文本存储堆栈信息的方式大大减少存储量,结合内存映射结构存储文件有助于虚拟内存到磁盘文件的映射和信息跟踪,同时结合文件符号表结构文件可以顺利便捷地实现对堆栈信息的解析,从而能够以最小的性能损耗获取堆栈的跟踪采样。
在一个实施例中,上述映射信息还可以包括文件节点号;此时,文件符号表获取模块1602在根据所述文件路径从所述文件符号表结构文件中获取对应的文件符号表结构信息时,可以结合所述文件节点号获取对应的文件符号表结构信息。从而可以通过文件节点号快速定位到相应的文件,提高堆栈信息解析的效率。
其中,在一个具体示例中,上述函数信息具体可以包括文件名、类名、函数名,以便于解析到具体的代码行。
在另一个具体示例中,上述内存偏移结构存储文件、内存映射结构存储文件可以是从前端应用终端接收获得,即,上述内存信息相关文件获取模块1601从前端应用终端接收获得所述内存偏移结构存储文件、所述内存映射结构存储文件。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性的计算机可读取存储介质中,如本发明实施例中,该程序可存储于计算机系统的存储介质中,并被该计算机系统中的至少一个处理器执行,以实现包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
Claims (10)
1.一种应用堆栈信息获取方法,其特征在于,包括步骤:
获取当前堆栈的内存偏移信息,所述内存偏移信息包括函数地址和PC偏移值,根据获取的内存偏移信息生成内存偏移结构存储文件;
获取虚拟内存和磁盘文件的映射关系,根据所述映射关系记录映射信息,生成内存映射结构存储文件,记录的所述映射信息包括虚拟内存地址范围、内存文件偏移量、以及文件路径;
将所述内存偏移结构存储文件、所述内存映射结构存储文件进行存储。
2.根据权利要求1所述的应用堆栈信息获取方法,其特征在于,包括下述各项中的至少一项:
记录的所述映射信息还包括文件节点号;
在堆栈信息采集结束时,采集满足预设条件的dex文件的映射数据,从所述映射数据中获得并记录所述映射信息。
3.根据权利要求1所述的应用堆栈信息获取方法,其特征在于,包括下述各项中的至少一项:
从获取堆栈信息时建立的stackInfo数组中获取所述PC偏移;将获取堆栈信息时建立的stackInfo数组的method指针指向的Method类的结构类型中的insns的值,确定为所述函数地址;
将所述内存偏移结构存储文件、所述内存映射结构存储文件压缩后进行存储;
将存储的所述内存偏移结构存储文件、所述内存映射结构存储文件向后台服务器发送,由后台服务器根据所述内存偏移结构存储文件、所述内存映射结构存储文件进行堆栈信息解析。
4.一种堆栈信息解析方法,其特征在于,包括步骤:
获取记录内存偏移信息的内存偏移结构存储文件、记录映射信息的内存映射结构存储文件,所述内存偏移信息包括函数地址和PC偏移值,所述映射信息包括虚拟内存地址范围、内存文件偏移量、以及文件路径;
获取记录文件符号表结构信息的文件符号表结构文件,所述文件符号表结构信息包括函数代码执行的起始位置、函数信息以及调试信息,所述调试信息包括PC相对起始位置对应的代码行号;
根据所述文件路径从所述文件符号表结构文件中获取对应的文件符号表结构信息,通过所述函数地址、虚拟内存地址范围、内存文件偏移量将所述函数地址转换为磁盘文件地址,并用所述磁盘文件地址在获取的所述文件符号表结构信息中查找到对应的函数信息和调试信息,并根据所述PC偏移值在该调试信息中查找到对应的代码行,获得解析后的堆栈信息。
5.根据权利要求4所述的堆栈信息解析方法,其特征在于:包括下述各项中的至少一项:
所述映射信息还包括文件节点号;在根据所述文件路径从所述文件符号表结构文件中获取对应的文件符号表结构信息时,结合所述文件节点号获取对应的文件符号表结构信息;
所述函数信息包括文件名、类名、函数名;
从前端应用终端接收获得所述内存偏移结构存储文件、所述内存映射结构存储文件。
6.一种应用堆栈信息获取装置,其特征在于,包括:
内存偏移获取模块,用于获取当前堆栈的内存偏移信息,所述内存偏移信息包括函数地址和PC偏移值,根据获取的内存偏移信息生成内存偏移结构存储文件;
内存映射获取模块,用于获取虚拟内存和磁盘文件的映射关系,根据所述映射关系记录映射信息,生成内存映射结构存储文件,记录的所述映射信息包括虚拟内存地址范围、内存文件偏移量、以及文件路径;
存储模块,用于将所述内存偏移结构存储文件、所述内存映射结构存储文件进行存储。
7.根据权利要求6所述的应用堆栈信息获取装置,其特征在于,包括下述各项中的至少一项:
记录的所述映射信息还包括文件节点号;
所述内存映射获取模块在堆栈信息采集结束时,采集满足预设条件的dex文件的映射数据,从所述映射数据中获得并记录所述映射信息。
8.根据权利要求6所述的应用堆栈信息获取装置,其特征在于,包括下述各项中的至少一项:
所述内存偏移获取模块从获取堆栈信息时建立的stackInfo数组中获取所述PC偏移;将获取堆栈信息时建立的stackInfo数组的method指针指向的Method类的结构类型中的insns的值,确定为所述函数地址;
所述存储模块将所述内存偏移结构存储文件、所述内存映射结构存储文件压缩后进行存储;
还包括文件上传模块,用于将存储的所述内存偏移结构存储文件、所述内存映射结构存储文件向后台服务器发送,由后台服务器根据所述内存偏移结构存储文件、所述内存映射结构存储文件进行堆栈信息解析。
9.一种堆栈信息解析装置,其特征在于,包括:
内存信息相关文件获取模块,用于获取记录内存偏移信息的内存偏移结构存储文件、记录映射信息的内存映射结构存储文件,所述内存偏移信息包括函数地址和PC偏移值,所述映射信息包括虚拟内存地址范围、内存文件偏移量、以及文件路径;
文件符号表获取模块,用于获取记录文件符号表结构信息的文件符号表结构文件,所述文件符号表结构信息包括函数代码执行的起始位置、函数信息以及调试信息,所述调试信息包括PC相对起始位置对应的代码行号;
解析模块,用于根据所述文件路径从所述文件符号表结构文件中获取对应的文件符号表结构信息,通过所述函数地址、虚拟内存地址范围、内存文件偏移量将所述函数地址转换为磁盘文件地址,并用所述磁盘文件地址在获取的所述文件符号表结构信息中查找到对应的函数信息和调试信息,并根据所述PC偏移值在该调试信息中查找到对应的代码行,获得解析后的堆栈信息。
10.根据权利要求9所述的堆栈信息解析装置,其特征在于:包括下述各项中的至少一项:
所述映射信息还包括文件节点号;所述文件符号表获取模块在根据所述文件路径从所述文件符号表结构文件中获取对应的文件符号表结构信息时,结合所述文件节点号获取对应的文件符号表结构信息;
所述函数信息包括文件名、类名、函数名;
所述内存信息相关文件获取模块从前端应用终端接收获得所述内存偏移结构存储文件、所述内存映射结构存储文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610891656.6A CN107943520B (zh) | 2016-10-11 | 2016-10-11 | 应用堆栈信息获取方法及装置、堆栈信息解析方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610891656.6A CN107943520B (zh) | 2016-10-11 | 2016-10-11 | 应用堆栈信息获取方法及装置、堆栈信息解析方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107943520A true CN107943520A (zh) | 2018-04-20 |
CN107943520B CN107943520B (zh) | 2020-10-30 |
Family
ID=61928818
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610891656.6A Active CN107943520B (zh) | 2016-10-11 | 2016-10-11 | 应用堆栈信息获取方法及装置、堆栈信息解析方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107943520B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109656779A (zh) * | 2018-12-07 | 2019-04-19 | 广州市百果园信息技术有限公司 | 内存监控方法、装置、终端和存储介质 |
CN109947466A (zh) * | 2019-01-15 | 2019-06-28 | 珠海金山网络游戏科技有限公司 | 一种逆向获取ue4全局对象表的方法及其装置 |
CN110084042A (zh) * | 2019-05-11 | 2019-08-02 | 肖银皓 | 一种应用程序堆栈静态分析方法及系统 |
CN112084028A (zh) * | 2020-09-07 | 2020-12-15 | 北京字节跳动网络技术有限公司 | 一种内存检测方法及装置 |
CN113032215A (zh) * | 2021-03-24 | 2021-06-25 | 北京字节跳动网络技术有限公司 | 线程快照解析方法、装置、设备和存储介质 |
CN117435440A (zh) * | 2023-12-20 | 2024-01-23 | 麒麟软件有限公司 | 一种程序堆空间的动态分析方法及系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6014515A (en) * | 1997-05-29 | 2000-01-11 | Hewlett-Packard Company | Enhanced stack unwind facility |
CN103106132A (zh) * | 2013-03-05 | 2013-05-15 | 中标软件有限公司 | Linux系统崩溃时内核函数调用栈分析调试方法 |
CN104572046A (zh) * | 2013-10-16 | 2015-04-29 | 腾讯科技(深圳)有限公司 | 一种堆栈还原方法和计算机系统 |
US20150378870A1 (en) * | 2014-06-30 | 2015-12-31 | Microsoft Corporation | Time travel debugging in managed runtime |
-
2016
- 2016-10-11 CN CN201610891656.6A patent/CN107943520B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6014515A (en) * | 1997-05-29 | 2000-01-11 | Hewlett-Packard Company | Enhanced stack unwind facility |
CN103106132A (zh) * | 2013-03-05 | 2013-05-15 | 中标软件有限公司 | Linux系统崩溃时内核函数调用栈分析调试方法 |
CN104572046A (zh) * | 2013-10-16 | 2015-04-29 | 腾讯科技(深圳)有限公司 | 一种堆栈还原方法和计算机系统 |
US20150378870A1 (en) * | 2014-06-30 | 2015-12-31 | Microsoft Corporation | Time travel debugging in managed runtime |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109656779A (zh) * | 2018-12-07 | 2019-04-19 | 广州市百果园信息技术有限公司 | 内存监控方法、装置、终端和存储介质 |
CN109947466A (zh) * | 2019-01-15 | 2019-06-28 | 珠海金山网络游戏科技有限公司 | 一种逆向获取ue4全局对象表的方法及其装置 |
CN110084042A (zh) * | 2019-05-11 | 2019-08-02 | 肖银皓 | 一种应用程序堆栈静态分析方法及系统 |
CN110084042B (zh) * | 2019-05-11 | 2021-07-30 | 佛山市微风科技有限公司 | 一种应用程序堆栈静态分析方法及系统 |
CN112084028A (zh) * | 2020-09-07 | 2020-12-15 | 北京字节跳动网络技术有限公司 | 一种内存检测方法及装置 |
CN112084028B (zh) * | 2020-09-07 | 2022-02-25 | 北京字节跳动网络技术有限公司 | 一种内存检测方法及装置 |
CN113032215A (zh) * | 2021-03-24 | 2021-06-25 | 北京字节跳动网络技术有限公司 | 线程快照解析方法、装置、设备和存储介质 |
CN113032215B (zh) * | 2021-03-24 | 2024-05-28 | 北京字节跳动网络技术有限公司 | 线程快照解析方法、装置、设备和存储介质 |
CN117435440A (zh) * | 2023-12-20 | 2024-01-23 | 麒麟软件有限公司 | 一种程序堆空间的动态分析方法及系统 |
CN117435440B (zh) * | 2023-12-20 | 2024-04-05 | 麒麟软件有限公司 | 一种程序堆空间的动态分析方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN107943520B (zh) | 2020-10-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107943520A (zh) | 应用堆栈信息获取方法及装置、堆栈信息解析方法及装置 | |
AU2006259831B2 (en) | Device specific content indexing for optimized device operation | |
CN108847977A (zh) | 一种业务数据的监控方法、存储介质和服务器 | |
CN102196478B (zh) | 一种网管系统故障的诊断方法和系统 | |
CN102750326A (zh) | 一种基于精简策略的集群系统的日志管理优化方法 | |
CN102523129A (zh) | 一种通用的航空总线测试分析方法及其装置 | |
CN104881481A (zh) | 一种存取海量时间序列数据的方法及装置 | |
CN103870202A (zh) | 一种块设备的分布式存储方法和系统 | |
CN101983376A (zh) | 访问装置、信息记录装置、信息记录系统、文件管理方法和程序 | |
CN104951482A (zh) | 一种操作Sparse格式的镜像文件的方法及装置 | |
CN115033569A (zh) | 一种自定义遥感影像元数据入库方法 | |
CN109698814A (zh) | 僵尸网络发现方法及僵尸网络发现装置 | |
CN116980475B (zh) | 一种基于binlog与双环形缓冲区的数据推送系统 | |
CN103067467A (zh) | 缓存方法及装置 | |
CN103957119A (zh) | 一种采用mib文件对网络设备进行管理的方法及浏览器 | |
KR102429855B1 (ko) | 파일 기반의 다양한 기종의 로그 데이터 저장 및 분석 방법 | |
CN106815010A (zh) | 一种操作数据库的方法及装置 | |
CN105549912A (zh) | 同时包含多种类操作系统的服务器集群的存储方法 | |
CN111797422A (zh) | 数据隐私保护查询方法、装置、存储介质及电子设备 | |
CN113360095B (zh) | 硬盘数据管理方法、装置、设备及介质 | |
CN100561953C (zh) | 一种记录诊断数据的方法 | |
CN107506283B (zh) | 一种主机向san存储推送信息的方法和系统 | |
Wan et al. | Survey of digital forensics technologies and tools for Android based intelligent devices | |
CN111104558A (zh) | 一种分布式的多源数据处理方法及系统 | |
CN111782588A (zh) | 一种文件读取方法、装置、设备和介质 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right |
Effective date of registration: 20211224 Address after: 19F, Kungang science and technology building, No. 777, Huancheng South Road, Xishan District, Kunming, Yunnan 650118 Patentee after: Yunnan Tengyun Information Industry Co.,Ltd. Address before: 2, 518000, East 403 room, SEG science and Technology Park, Zhenxing Road, Shenzhen, Guangdong, Futian District Patentee before: TENCENT TECHNOLOGY (SHENZHEN) Co.,Ltd. |
|
TR01 | Transfer of patent right |