CN103853603A - 一种函数调用关系的获取方法和装置 - Google Patents
一种函数调用关系的获取方法和装置 Download PDFInfo
- Publication number
- CN103853603A CN103853603A CN201210523735.3A CN201210523735A CN103853603A CN 103853603 A CN103853603 A CN 103853603A CN 201210523735 A CN201210523735 A CN 201210523735A CN 103853603 A CN103853603 A CN 103853603A
- Authority
- CN
- China
- Prior art keywords
- function
- fileinfo
- information list
- call
- place file
- 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
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种函数调用关系的获取方法和装置,属于计算机领域。所述方法包括:当程序运行过程中调用函数时,获取所述函数的函数信息,所述函数信息至少包括所述函数的入口地址和出口地址;获取用于运行所述函数的执行单元,所述执行单元包括进程或线程;根据所述执行单元运行的函数的函数信息构造所述执行单元对应的函数调用关系图。所述装置包括:第一获取模块、第二获取模块和构造模块。本发明通过程序运行过程中调用的函数的函数信息以及用于运行该函数的执行单元构造该执行单元对应的函数的函数调用关系图,从而解决了现有技术中存在多个进程或多个线程同时执行相同函数时,构造出来的函数调用关系图与程序实际执行流不符的问题。
Description
技术领域
本发明涉及计算机领域,特别涉及一种函数调用关系的获取方法和装置。
背景技术
在大型软件开发过程中,特别是在多人协作的开发场景中,经常需要构造程序执行过程中函数调用关系图,以使开发者根据函数调用关系图理解程序或者程序片段在实际执行时的动态行为。
目前现有技术存在获取函数调用关系的方法,可以通过该方法获取程序运行过程中调用函数的函数调用关系图;但是在程序执行的过程中,如果存在多个进程或多个线程同时执行相同函数时,通过现有技术只获取到一个函数调用关系图,而这与程序实际执行流不符。
发明内容
为了在程序运行的过程中,如果存在多个进程或多个线程同时运行相同函数时,构造出与程序实际执行流相符的函数调用关系图,本发明提供了一种函数调用关系的获取方法和装置。所述技术方案如下:
一种函数调用关系的获取方法,所述方法包括:
当程序运行过程中调用函数时,获取所述函数的函数信息,所述函数信息至少包括所述函数的入口地址和出口地址;
获取用于运行所述函数的执行单元,所述执行单元包括进程或线程;
根据所述执行单元运行的函数的函数信息构造所述执行单元对应的函数调用关系图。
所述函数的函数信息还包括所述函数所在文件的文件信息在信息列表中的序号,所述信息列表用于存储文件的文件信息;
所述获取所述函数的函数信息,包括:
获取所述函数所在文件的文件信息在所述信息列表中的序号。
所述获取所述函数所在文件的文件信息在所述信息列表中的序号,包括:
根据所述函数的入口地址,判断所述函数是否为程序中包含的函数;
如果所述函数是所述程序中包含的函数,判断序号空间中是否包括所述程序所在文件的文件信息在信息列表中的序号,如果所述序号空间中包括所述程序所在文件的文件信息在所述信息列表中的序号,则将所述序号空间包括的所述程序所在文件的文件信息在所述信息列表中的序号确定为所述函数所在文件的文件信息在所述信息列表中的序号。
所述方法还包括:
如果所述序号空间为空,则获取所述函数所在文件的文件信息,将所述函数所在文件的文件信息存储在所述信息列表中,设置所述函数所在文件的文件信息在所述信息列表中的序号,将所述函数所在文件的文件信息在所述信息列表中的序号存储在所述序号空间中。
所述方法还包括:
如果所述函数不是所述程序中包含的函数,则判断出所述函数为动态链接库包含的函数,根据所述函数的入口地址查找所述信息列表,当查找出所述信息列表中存在所述动态链接库所在文件的文件信息,则将所述动态链接库所在文件的文件信息在所述信息列表中的序号确定为所述函数所在文件的文件信息在所述信息列表中的序号。
所述方法还包括:
当查找出所述信息列表中不存在所述动态链接库所在文件的文件信息,获取所述动态链接库所在文件的文件信息,将所述动态链接库所在文件的文件信息存储在所述信息列表中,设置所述动态链接库所在文件的文件信息在所述信息列表中的序号。
所述根据所述执行单元对应的函数的函数信息构造所述执行单元对应的函数调用关系图之后,还包括:
从所述执行单元对应的函数调用关系图中过滤系统函数及所述系统函数的调用关系。
所述从所述执行单元对应的函数调用关系图中过滤系统函数的调用关系,包括:
计算所述执行单元对应的函数调用关系图中包括的函数的入度和出度,所述函数的入度为调用所述函数的函数的个数,所述函数的出度为所述函数调用的函数的个数;
过滤出度为零的系统函数及所述系统函数的调用关系,减少调用所述系统函数的函数的出度;
过滤入度为1且出度为1的系统函数及所述系统函数的调用关系,增加调用所述系统函数的函数和所述系统函数调用的函数之间的调用关系;
根据所述函数调用关系图中包括的剩下函数的函数信息重新构建函数调用关系图,计算所述函数调用关系图包括的函数的出度和入度;
过滤入度为零的系统函数及所述系统函数的调用关系,以及减少所述系统调用的函数的入度。
所述获取所述函数的函数信息之前,还包括:
接收开始时间和结束时间,在所述开始时间和所述结束时间之间设置记录标识为真;
所述获取所述函数的函数信息,包括:
当程序运行过程中调用函数时,对所述记录标识进行判断,如果所述记录标识为真,则获取所述函数的函数信息。
一种函数调用关系的获取装置,所述装置包括:
第一获取模块,用于当程序运行过程中调用函数时,获取所述函数的函数信息,所述函数信息至少包括所述函数的入口地址和出口地址;
第二获取模块,用于获取用于运行所述函数的执行单元,所述执行单元包括进程或线程;
构造模块,用于根据所述执行单元运行的函数的函数信息构造所述执行单元对应的函数调用关系图。
所述函数的函数信息还包括所述函数所在文件的文件信息在信息列表中的序号,所述信息列表用于存储文件的文件信息;
所述第一获取模块,还用于获取所述函数所在文件的文件信息在所述信息列表中的序号。
所述第一获取模块包括:
判断单元,用于根据所述函数的入口地址,判断所述函数是否为程序中包含的函数;
第一获取单元,用于如果所述函数是所述程序中包含的函数,判断序号空间中是否包括所述程序所在文件的文件信息在信息列表中的序号,如果所述序号空间中包括所述程序所在文件的文件信息在所述信息列表中的序号,则将所述序号空间包括的所述程序所在文件的文件信息在所述信息列表中的序号确定为所述函数所在文件的文件信息在所述信息列表中的序号。
所述第一获取模块还包括:
第二获取单元,用于如果所述序号空间为空,则获取所述函数所在文件的文件信息,将所述函数所在文件的文件信息存储在所述信息列表中,设置所述函数所在文件的文件信息在所述信息列表中的序号,将所述函数所在文件的文件信息在所述信息列表中的序号存储在所述序号空间中。
所述第一获取模块还包括:
第三获取单元,用于如果所述函数不是所述程序中包含的函数,则判断出所述函数为动态链接库包含的函数,根据所述函数的入口地址查找所述信息列表,当查找出所述信息列表中存在所述动态链接库所在文件的文件信息,则将所述动态链接库所在文件的文件信息在所述信息列表中的序号确定为所述函数所在文件的文件信息在所述信息列表中的序号。
所述第一获取模块还包括:
第四获取单元,用于当查找出所述信息列表中不存在所述动态链接库所在文件的文件信息,获取所述动态链接库所在文件的文件信息,将所述动态链接库所在文件的文件信息存储在所述信息列表中,设置所述动态链接库所在文件的文件信息在所述信息列表中的序号。
所述装置还包括:
过滤模块,用于根据所述执行单元对应的函数的函数信息构造所述执行单元对应的函数调用关系图之后,从所述执行单元对应的函数调用关系图中过滤系统函数及所述系统函数的调用关系。
所述过滤模块包括:
第一计算单元,用于计算所述执行单元对应的函数调用关系图中包括的函数的入度和出度,所述函数的入度为调用所述函数的函数的个数,所述函数的出度为所述函数调用的函数的个数;
第一过滤单元,用于过滤出度为零的系统函数及所述系统函数的调用关系,减少调用所述系统函数的函数的出度;
第二过滤单元,用于过滤入度为1且出度为1的系统函数及所述系统函数的调用关系,增加调用所述系统函数的函数和所述系统函数调用的函数之间的调用关系;
第二计算单元,用于根据所述函数调用关系图中包括的剩下函数的函数信息重新构建函数调用关系图,计算所述函数调用关系图包括的函数的出度和入度;
第三过滤单元,用于过滤入度为零的系统函数及所述系统函数的调用关系,以及减少所述系统调用的函数的入度。
所述装置还包括:
接收模块,用于接收开始时间和结束时间,在所述开始时间和所述结束时间之间设置记录标识为真;
所述第一获取模块,包括:
第五获取单元,用于当程序运行过程中调用函数时,对所述记录标识进行判断,如果所述记录标识为真,则获取所述函数的函数信息。
本发明提供的技术方案的有益效果是:
在本发明实施例中,当程序运行过程中调用函数时,获取该函数的函数信息以及用于运行该函数的执行单元,该执行单元包括线程或进程,通过执行单元运行的函数的函数信息构造出该执行单元对应的函数的函数调用关系图。其中,由于在获取函数的函数信息时,同时获取运行该函数的进程或线程,因而可以根据每个进程或线程所运行函数的函数信息获取到每个进程或线程对应的函数调用关系图,从而解决了现有技术中如果存在多个进程或多个线程同时执行相同函数时,构造出来的函数调用关系图与程序实际执行流不符的问题。
附图说明
图1是本发明实施例1提供的一种函数调用关系的获取方法;
图2是本发明实施例2提供的一种函数调用关系的获取方法;
图3是本发明实施例2提供的一种获取函数所在文件信息在信息列表中的序号的流程图;
图4是本发明实施例2提供的一种过滤系统函数及其调用关系的流程图;
图5是本发明实施例2提供的一种函数调用关系图;
图6是本发明实施例2提供的一种函数调用关系图;
图7是本发明实施例2提供的一种函数调用关系图;
图8是本发明实施例2提供的一种函数调用关系图;
图9是本发明实施例3提供的一种函数调用关系的获取装置;。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
实施例1
本发明实施例提供了一种函数调用关系的获取方法,参见图1,该方法包括:
步骤101:当程序运行过程中调用函数时,获取所述函数的函数信息,所述函数信息至少包括所述函数的入口地址和出口地址;
步骤102:获取用于运行所述函数的执行单元,所述执行单元包括进程或线程;
步骤103:根据所述执行单元运行的函数的函数信息构造所述执行单元对应的函数调用关系图。
在本发明实施例中,当程序运行过程中调用函数时,获取该函数的函数信息以及用于运行该函数的执行单元,该执行单元包括线程或进程,通过执行单元运行的函数的函数信息构造出该执行单元对应的函数的函数调用关系图,由于每个进程或线程对应该进程或线程所运行函数的函数调用关系图,从而解决了现有技术中如果存在多个进程或多个线程同时执行相同函数时,构造出来的函数调用关系图与程序实际执行流不符的问题。
实施例2
本发明实施例提供了一种函数调用关系的获取方法,参见图2,该方法包括:
步骤201:在程序运行的过程中,当程序调用函数时,获取该函数的函数信息,该函数信息至少包括该函数的入口地址和出口地址;
具体地,在程序运行的过程中,当程序调用函数时,通过该函数内包括的插装代码来获取该函数的函数信息。
其中,在程序运行之前,先对程序的源代码包括的每行语句进行分析,当分析出调用函数的语句时,获取该语句需要调用的函数,在该函数中插入插装代码,该插装代码至少用于获取该函数的入口地址、该函数的出口地址以及运行该函数的执行单元。
其中,可以将该插装代码插入到该函数包括的第一行语句之前,最后一行语句之后或者第一行语句和最后一行语句之间;优选地,可以将该插装代码插入在该函数包括的第一行语句之前。
其中,该函数的函数信息还可以包括该函数所在文件的文件信息在信息列表中的序号,该信息列表用于存储文件的文件信息与序号的对应关系。
进一步地,在本步骤中,除了获取该函数的入口地址和出口地址之外,还可以获取该函数所在文件的文件信息在信息列表中的序号。
其中,文件的文件信息至少包括该文件的基地址、该文件的结束地址以及该文件的文件名。
参见图3,获取该函数所在文件的文件信息在信息列表中的序号,可以包括如下步骤(1)至(7),分别为:
(1):根据该函数的入口地址,判断该函数是否为程序中包含的函数,如果该函数是程序中包含的函数,执行步骤(2),如果该函数不是程序中包含的函数,执行步骤(5);
具体地,获取程序所在文件的基地址和结束地址,根据该函数的入口地址,判断该函数的入口地址是否在程序所在文件的基地址和结束地址之间,如果该函数的入口地址在程序所在文件的基地址和结束地址之间,则判断出该函数为程序中包含的函数,如果该函数的入口地址不在程序所在文件的基地址和结束地址之间,则判断出该函数不是程序中包含的函数。
其中,磁盘中包括程序所在的文件,当需要运行程序时,在内存中分配一个内存空间,将程序从磁盘中加载到该内存空间中,该内存空间的起始地址为程序所在文件的基地址,以及,该内存空间的结束地址为程序所在文件的结束地址。
(2):判断序号空间中是否包括程序所在文件的文件信息在信息列表中的序号,如果该序号空间中包括程序所在文件的文件信息在信息列表中的序号,执行步骤(3),如果该序号空间为空,执行步骤(4);
其中,该序号空间用于存储程序所在文件的文件信息在信息列表中的序号,该序号空间事先为空,当第一次获取到程序所在文件的文件信息在信息列表中的序号时,便将获取到的程序所在文件的文件信息在信息列表中的序号存储在该序号空间中。
(3):将序号空间包括的程序所在文件的文件信息在信息列表中的序号确定为该函数所在文件的文件信息在信息列表中的序号,结束返回;
(4):获取函数所在文件的文件信息,将函数所在文件的文件信息存储在信息列表中,设置函数所在文件的文件信息在信息列表中的序号,如此得到该函数所在文件的文件信息在信息列表中的序号,结束返回;
进一步地,将获取到的函数所在文件的文件信息在信息列表中的序号存储在该序号空间中。
其中,获取到函数所在文件的文件信息后,如果在将该文件信息存储到信息列表之前该信息列表为空,则将该文件信息存储到信息列表中,设置该文件信息的序号的初值,如果在将该文件信息存储到信息列表之前该信息列表不为空,则获取该信息列表中包括的最末尾的一个文件信息的序号,将该文件信息插入到信息列表的末尾,增加获取的序号,将增加的序号确定为该文件信息的序号。
其中,设置该文件信息的序号的初值的操作,可以为:将该文件信息的序号的初值设置为0或1等;以及,增加获取的序号的操作,可以为:将获取的序号增加1或2等。
(5):确定出该函数为动态链接库中包含的函数,根据该函数的入口地址查找信息列表中是否存在该动态链接库所在文件的文件信息,如果信息列表中存在该动态链接库所在文件的文件信息,执行步骤(6),如果信息列表中不存在该动态链接库所在文件的文件信息,执行步骤(7);
具体地,遍历信息列表中包含的所有文件信息,根据该函数的入口地址以及文件信息中所包含的文件的基地址和结束地址,判断该函数的入口地址是否在某一文件的文件信息包含的基地址和结束地址之间,如果该函数的入口地址在某一文件的文件信息中包含的基地址和结束地址之间,则该文件信息为该函数所在动态链接库的文件信息即判断出信息列表中存在该动态链接库所在文件的文件信息。
(6):将动态链接库所在文件的文件信息在信息列表中的序号确定为该函数所在文件的文件信息在信息列表中的序号,结束返回;
具体地,根据该动态链接库所在文件的文件信息,从该信息列表中获取该动态链接库所在文件的文件信息在信息列表中的序号,将动态链接库所在文件的文件信息在信息列表中的序号确定为该函数所在文件的文件信息在信息列表中的序号。
(7):获取该动态链接库所在文件的文件信息,将该动态链接库所在文件的文件信息存储在信息列表中,设置该动态链接库所在文件的文件信息在信息列表中的序号。
其中,当函数为动态链接库包括的函数时,该函数所在文件的文件信息包括该函数所在动态链接库的基地址、结束地址和文件名。
其中,磁盘中包括动态链接库所在的文件,当需要加载动态链接库时,在内存中分配一个内存空间,将动态链接库从磁盘中加载到该内存空间中,该内存空间的起始地址为动态链接库所在文件的基地址,以及,该内存空间的结束地址为动态链接库所在文件的结束地址。
其中,获取到动态链接库所在文件的文件信息后,如果在将该文件信息存储到信息列表之前该信息列表为空,则将该文件信息存储到信息列表中,设置该文件信息的序号的初值,如果在将该文件信息存储到信息列表之前该信息列表不为空,则获取该信息列表中包括的最末尾的一个文件信息的序号,将该文件信息插入到信息列表的末尾,增加获取的序号,将增加的序号确定为该文件信息的序号。
其中,设置该文件信息的序号的初值的操作,可以为:将该文件信息的序号的初值设置为0或1等;以及,增加获取的序号的操作,可以为:将获取的序号增加1或2等。
其中,通过获取该函数所在文件的文件信息在信息列表中的序号,可以区分出被调用的函数是程序包括的函数还是动态链接库包括的函数,解决了当被调用函数是动态链接库包括的函数时,将函数地址转换为函数名时找不到函数名而报错的问题。
步骤202:获取用于运行该函数的执行单元,该执行单元包括进程或线程;
具体地,调用用于获取执行单元的系统函数,通过该系统函数获取当前执行点所在的执行单元,将获取的执行单元确定为用于执行该函数的执行单元。
其中,当调用该函数时,为该函数分配一个执行单元,通过该执行单元来运行该函数,在运行该函数的过程,当前的执行点位于该函数中,所以获取到的当前执行点所在执行单元即为用于运行该函数的执行单元。
步骤203:将该函数的函数信息存储在用于运行该函数的执行单元对应的存储空间中;
其中,用于运行该函数的执行单元对应的存储空间可以为文件等。
其中,对于程序运行过程中调用的每一个函数,都执行步骤201至步骤203的操作,得到每个函数对应的函数信息,并将每一个函数的函数信息存储在用于运行该函数的执行单元对应的存储空间中。
当程序运行结束时,每一个执行单元对应的存储空间中存储有该执行单元中调用的所有函数的函数信息,具体表现为一系列有序的带有入口标识的入口地址、带有退出标识的出口地址以及该函数所在文件的文件信息在信息列表中的序号。
其中,对于程序运行过程中调用的每一个函数,该函数所在文件的文件信息在信息列表中的序号,可以存储到该函数的入口地址之后或者该函数的出口地址之后。
步骤204:根据执行单元对应的存储空间中存储的函数信息构造该执行单元所对应的函数调用关系图;
具体地,根据执行单元对应的存储空间中存储的有序的带有进入标识的入口地址、带有退出标识的出口地址以及该函数所在文件的文件信息在信息列表中的序号得到函数的函数名及函数的调用关系,进而将函数的函数名和函数的调用关系构造为函数的调用关系图。
例如,如果在某一执行单元对应的存储空间中存储的函数信息中,函数A的入口地址在函数B的入口地址之前,而函数A的出口地址在函数B的出口地址之后,则判断出函数A一定调用了函数B。利用这种特性以及收集到的有序的带有进入标识的入口地址、带有退出标识的出口地址,就可以构造出完整的该执行单元所对应的函数调用关系图。
步骤205:从执行单元对应的函数调用关系图中过滤系统函数及系统函数的调用关系;
具体地,参见图4,从执行单元对应的函数调用关系图中过滤系统函数的调用关系包括以下几个步骤:
(1):标记出需要过滤的系统函数,计算执行单元对应的函数调用关系图中包括的函数的入度和出度;
其中,可以根据系统函数的函数名标记出需要过滤的系统函数。
其中,函数的入度为调用该函数的函数的个数,函数的出度为该函数调用的函数的个数。
例如,如图5所示的函数调用关系图,以函数A_2为例,函数A_1被函数B_1调用,函数A_2调用了函数A_3和函数B_2,所以函数A_2的入度为1,出度为2。
(2):设置外层循环标记为真;
(3):判断外层循环标记,如果外层循环标记为真,执行步骤(4),如果外层循环标记为假,结束;
(4):设置外层循环标记为假;
(5):查找执行单元对应的函数调用关系图中是否存在出度为零的系统函数,如果存在函数出度为零的系统函数,则执行步骤(6),如果不存在函数出度为零的函数,执行步骤(7);
(6):选取出度为零的系统函数,去除选取的出度为零的系统函数及其调用关系,并减少所有调用该出度为零的系统函数的函数的出度,返回步骤(5);
例如,在如图5所示的函数调用关系图中,假设以A_为开头的函数均为系统函数,由于函数A_3出度为零,函数A_3被函数A_2调用,则去除函数A_3以及函数A_3和函数A_2之间的调用关系,并减少函数A_2的出度,此时函数A_2只调用了函数B_2,函数A_2的出度为1,去除出度为零的系统函数后,函数的调用关系图如图6。
(7):查找执行单元对应的函数调用关系图中是否存在出度为1且入度为1的系统函数,如果存在出度为1且入度为1的系统函数,执行步骤(8),如果不存在出度为1且入度为1的系统函数,执行步骤(9);
(8):去除该出度为1且入度为1的系统函数及其调用关系,增加调用该系统函数和被该系统函数调用的函数的调用关系,重新构建函数调用关系图,设置外层循环标记为真并返回步骤(7);
具体地,选取出度为1且入度为1的系统函数,去除该出度为1且入度为1的系统函数的调用关系,并增加调用该出度为1且入度为1的系统函数的函数和该出度为1且入度为1的系统函数调用的函数之间的调用关系,重新构建函数调用关系图,重新计算该执行单元对应的函数调用关系图中包括的函数的入度和出度,并将外层循环标记设置为真。
例如,在如图6所示的函数调用关系图中,函数A_2出度为1且入度为1,函数A_2被函数B_1调用且函数A_2调用函数B_2,所以,此时,去除函数A_2、函数A_2和函数B_1以及函数A_2和函数B_2之间的调用关系,并增加函数B_1和函数B_2的调用关系,重新构建后的函数调用关系图如图7。
(9):查找执行单元对应的函数调用关系图中是否存在入度为零的系统函数,如果存在入度为零的系统函数,执行步骤(10),如果不存在入度为零的系统函数,执行步骤(3);
(10):选取入度为零的系统函数,去除该入度为零的函数及其调用关系,将所有调用该入度为零的系统函数的函数的入度减1,设置外层循环标记为真并返回步骤(9)。
例如,在如图7所示的函数调用关系图中,函数A_1的入度为零,函数A_1调用函数B_1,则去除函数A_1以及函数A_1和函数B_1之间的调用关系,并将函数B_1的入度减少,此时B_1的入度为零。
其中,在本步骤中过滤掉系统函数及系统函数的调用关系后,重新构建的函数调用关系图如图8,过滤掉系统函数及系统函数的调用关系以后的函数调用关系图更加突出了用户所关心的函数之间的调用关系。
步骤206:将执行单元对应的函数调用关系图显示给用户。
其中,用户可以选择该执行单元对应的函数调用关系图中的任一个函数,系统获取该函数的调用的第一函数以及调用该函数的第二函数,并显示该函数、第一函数以及第二函数之间的函数调用关系,隐藏该执行单元对应的函数调用关系图中其余的函数及其调用关系。
其中,可以获取该执行单元对应的函数调用关系图中所有的函数,并将所有的函数存储到一个列表中,用户可以选择该列表中存储的任一个函数,系统获取该函数的调用的第一函数以及调用该函数的第二函数,并显示该函数、第一函数以及第二函数之间的函数调用关系。
其中,用户可以通过选择函数调用关系图或者列表中包括的任一个函数,来查看该函数的调用关系,从而展现用户所关注的重要函数的调用关系,隐藏用户所不关心的细节,如此可动态控制最终展示给用户的图像,最大化的满足用户的需求。
其中,本发明实施例中,可以在获取函数信息之前接收用户输入的开始时间和结束时间,选择性的获取用户想要得到的函数信息。
具体地,接收用户输入的开始时间和结束时间,该开始时间和结束时间为用户关心的程序开始执行的时间和结束执行的时间,并在该开始时间和结束时间之间设置记录标识为真,当程序运行时,对该记录标识进行判断,如果该记录标识为真,则执行步骤201至步骤206。
其中,在获取函数的函数信息之前接收开始时间和结束时间,并设置记录标识,能够选择性的获取用户想要得到的函数信息,尤其是对于系统中循环执行的服务性程序,通过控制开始时间和结束时间能够有效的减少由于其他无关的函数调用而导致的数据量,解决了在构造函数调用关系图时由于信息量大而导致处理效率低的问题,以及生成的函数调用关系图模糊无法辨认的问题。
其中,本发明实施例中,步骤205为一优选的步骤,该步骤可以过滤掉系统函数及系统函数的调用关系,从而更加突出用户所关心的函数之间的调用关系,也可以跳过该步骤,在从执行单元对应的函数调用关系图中过滤系统函数及系统函数的调用关系之后直接将执行单元对应的函数调用关系图显示给用户。
在本发明实施例中,当程序运行过程中调用函数时,获取该函数的函数信息以及用于运行该函数的执行单元,该执行单元包括线程或进程,通过执行单元运行的函数的函数信息构造出该执行单元对应的函数的函数调用关系图,由于每个进程或线程对应该进程或线程所运行函数的函数调用关系图,从而解决了现有技术中如果存在多个进程或多个线程同时执行相同函数时,构造出来的函数调用关系图与程序实际执行流不符的问题。
实施例3
本发明实施例提供了一种函数调用关系的获取方法,参见图2,该装置包括:
第一获取模块301,用于当程序运行过程中调用函数时,获取所述函数的函数信息,所述函数信息至少包括所述函数的入口地址和出口地址;
第二获取模块302,用于获取用于运行所述函数的执行单元,所述执行单元包括进程或线程;
构造模块303,用于根据所述执行单元运行的函数的函数信息构造所述执行单元对应的函数调用关系图。
其中,所述函数的函数信息还包括所述函数所在文件的文件信息在信息列表中的序号,所述信息列表用于存储文件的文件信息;
其中,第一获取模块301,还用于获取所述函数所在文件的文件信息在所述信息列表中的序号。
其中,第一获取模块301包括:
判断单元3011,用于根据所述函数的入口地址,判断所述函数是否为程序中包含的函数;
第一获取单元3012,用于如果所述函数是所述程序中包含的函数,判断序号空间中是否包括所述程序所在文件的文件信息在信息列表中的序号,如果所述序号空间中包括所述程序所在文件的文件信息在所述信息列表中的序号,则将所述序号空间包括的所述程序所在文件的文件信息在所述信息列表中的序号确定为所述函数所在文件的文件信息在所述信息列表中的序号。
其中,第一获取模块301还包括:
第二获取单元3013,用于如果所述序号空间为空,则获取所述函数所在文件的文件信息,将所述函数所在文件的文件信息存储在所述信息列表中,设置所述函数所在文件的文件信息在所述信息列表中的序号,将所述函数所在文件的文件信息在所述信息列表中的序号存储在所述序号空间中。
其中,第一获取模块301还包括:
第三获取单元3014,用于如果所述函数不是所述程序中包含的函数,则判断出所述函数为动态链接库包含的函数,根据所述函数的入口地址查找所述信息列表,当查找出所述信息列表中存在所述动态链接库所在文件的文件信息,则将所述动态链接库所在文件的文件信息在所述信息列表中的序号确定为所述函数所在文件的文件信息在所述信息列表中的序号。
其中,第一获取模块301还包括:
第四获取单元3015,用于当查找出所述信息列表中不存在所述动态链接库所在文件的文件信息,获取所述动态链接库所在文件的文件信息,将所述动态链接库所在文件的文件信息存储在所述信息列表中,设置所述动态链接库所在文件的文件信息在所述信息列表中的序号。
进一步地,该装置还包括:
过滤模块304,用于根据所述执行单元对应的函数的函数信息构造所述执行单元对应的函数调用关系图之后,从所述执行单元对应的函数调用关系图中过滤系统函数及所述系统函数的调用关系。
其中,过滤模块304包括:
第一计算单元3041,用于计算所述执行单元对应的函数调用关系图中包括的函数的入度和出度,所述函数的入度为调用所述函数的函数的个数,所述函数的出度为所述函数调用的函数的个数;
第一过滤单元3042,用于过滤出度为零的系统函数及所述系统函数的调用关系,减少调用所述系统函数的函数的出度;
第二过滤单元3043,用于过滤入度为1且出度为1的系统函数及所述系统函数的调用关系,增加调用所述系统函数的函数和所述系统函数调用的函数之间的调用关系;
第二计算单元3044,用于根据所述函数调用关系图中包括的剩下函数的函数信息重新构建函数调用关系图,计算所述函数调用关系图包括的函数的出度和入度;
第三过滤单元3045,用于过滤入度为零的系统函数及所述系统函数的调用关系,以及减少所述系统调用的函数的入度。
进一步地,该装置还包括:
接收模块305,用于接收开始时间和结束时间,在所述开始时间和所述结束时间之间设置记录标识为真;
其中,第一获取模块301,包括:
第五获取单元3016,用于当程序运行过程中调用函数时,对所述记录标识进行判断,如果所述记录标识为真,则获取所述函数的函数信息。
在本发明实施例中,当程序运行过程中调用函数时,获取该函数的函数信息以及用于运行该函数的执行单元,该执行单元包括线程或进程,通过执行单元运行的函数的函数信息构造出该执行单元对应的函数的函数调用关系图,由于每个进程或线程对应该进程或线程所运行函数的函数调用关系图,从而解决了现有技术中如果存在多个进程或多个线程同时执行相同函数时,构造出来的函数调用关系图与程序实际执行流不符的问题。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (18)
1.一种函数调用关系的获取方法,其特征在于,所述方法包括:
当程序运行过程中调用函数时,获取所述函数的函数信息,所述函数信息至少包括所述函数的入口地址和出口地址;
获取用于运行所述函数的执行单元,所述执行单元包括进程或线程;
根据所述执行单元运行的函数的函数信息构造所述执行单元对应的函数调用关系图。
2.如权利要求1所述的方法,其特征在于,
所述函数的函数信息还包括所述函数所在文件的文件信息在信息列表中的序号,所述信息列表用于存储文件的文件信息;
所述获取所述函数的函数信息,包括:
获取所述函数所在文件的文件信息在所述信息列表中的序号。
3.如权利要求2所述的方法,其特征在于,所述获取所述函数所在文件的文件信息在所述信息列表中的序号,包括:
根据所述函数的入口地址,判断所述函数是否为程序中包含的函数;
如果所述函数是所述程序中包含的函数,判断序号空间中是否包括所述程序所在文件的文件信息在信息列表中的序号,如果所述序号空间中包括所述程序所在文件的文件信息在所述信息列表中的序号,则将所述序号空间包括的所述程序所在文件的文件信息在所述信息列表中的序号确定为所述函数所在文件的文件信息在所述信息列表中的序号。
4.如权利要求3所述的方法,其特征在于,所述方法还包括:
如果所述序号空间为空,则获取所述函数所在文件的文件信息,将所述函数所在文件的文件信息存储在所述信息列表中,设置所述函数所在文件的文件信息在所述信息列表中的序号,将所述函数所在文件的文件信息在所述信息列表中的序号存储在所述序号空间中。
5.如权利要求3所述的方法,其特征在于,所述方法还包括:
如果所述函数不是所述程序中包含的函数,则判断出所述函数为动态链接库包含的函数,根据所述函数的入口地址查找所述信息列表,当查找出所述信息列表中存在所述动态链接库所在文件的文件信息,则将所述动态链接库所在文件的文件信息在所述信息列表中的序号确定为所述函数所在文件的文件信息在所述信息列表中的序号。
6.如权利要求5所述的方法,其特征在于,所述方法还包括:
当查找出所述信息列表中不存在所述动态链接库所在文件的文件信息,获取所述动态链接库所在文件的文件信息,将所述动态链接库所在文件的文件信息存储在所述信息列表中,设置所述动态链接库所在文件的文件信息在所述信息列表中的序号。
7.如权利要求1所述的方法,其特征在于,所述根据所述执行单元对应的函数的函数信息构造所述执行单元对应的函数调用关系图之后,还包括:
从所述执行单元对应的函数调用关系图中过滤系统函数及所述系统函数的调用关系。
8.如权利要求7所述的方法,其特征在于,所述从所述执行单元对应的函数调用关系图中过滤系统函数的调用关系,包括:
计算所述执行单元对应的函数调用关系图中包括的函数的入度和出度,所述函数的入度为调用所述函数的函数的个数,所述函数的出度为所述函数调用的函数的个数;
过滤出度为零的系统函数及所述系统函数的调用关系,减少调用所述系统函数的函数的出度;
过滤入度为1且出度为1的系统函数及所述系统函数的调用关系,增加调用所述系统函数的函数和所述系统函数调用的函数之间的调用关系;
根据所述函数调用关系图中包括的剩下函数的函数信息重新构建函数调用关系图,计算所述函数调用关系图包括的函数的出度和入度;
过滤入度为零的系统函数及所述系统函数的调用关系,以及减少所述系统调用的函数的入度。
9.如权利要求1所述的方法,其特征在于,所述获取所述函数的函数信息之前,还包括:
接收开始时间和结束时间,在所述开始时间和所述结束时间之间设置记录标识为真;
所述获取所述函数的函数信息,包括:
当程序运行过程中调用函数时,对所述记录标识进行判断,如果所述记录标识为真,则获取所述函数的函数信息。
10.一种函数调用关系的获取装置,其特征在于,所述装置包括:
第一获取模块,用于当程序运行过程中调用函数时,获取所述函数的函数信息,所述函数信息至少包括所述函数的入口地址和出口地址;
第二获取模块,用于获取用于运行所述函数的执行单元,所述执行单元包括进程或线程;
构造模块,用于根据所述执行单元运行的函数的函数信息构造所述执行单元对应的函数调用关系图。
11.如权利要求10所述的装置,其特征在于,
所述函数的函数信息还包括所述函数所在文件的文件信息在信息列表中的序号,所述信息列表用于存储文件的文件信息;
所述第一获取模块,还用于获取所述函数所在文件的文件信息在所述信息列表中的序号。
12.如权利要求11所述的装置,其特征在于,所述第一获取模块包括:
判断单元,用于根据所述函数的入口地址,判断所述函数是否为程序中包含的函数;
第一获取单元,用于如果所述函数是所述程序中包含的函数,判断序号空间中是否包括所述程序所在文件的文件信息在信息列表中的序号,如果所述序号空间中包括所述程序所在文件的文件信息在所述信息列表中的序号,则将所述序号空间包括的所述程序所在文件的文件信息在所述信息列表中的序号确定为所述函数所在文件的文件信息在所述信息列表中的序号。
13.如权利要求12所述的装置,其特征在于,所述第一获取模块还包括:
第二获取单元,用于如果所述序号空间为空,则获取所述函数所在文件的文件信息,将所述函数所在文件的文件信息存储在所述信息列表中,设置所述函数所在文件的文件信息在所述信息列表中的序号,将所述函数所在文件的文件信息在所述信息列表中的序号存储在所述序号空间中。
14.如权利要求12所述的装置,其特征在于,所述第一获取模块还包括:
第三获取单元,用于如果所述函数不是所述程序中包含的函数,则判断出所述函数为动态链接库包含的函数,根据所述函数的入口地址查找所述信息列表,当查找出所述信息列表中存在所述动态链接库所在文件的文件信息,则将所述动态链接库所在文件的文件信息在所述信息列表中的序号确定为所述函数所在文件的文件信息在所述信息列表中的序号。
15.如权利要求14所述的装置,其特征在于,所述第一获取模块还包括:
第四获取单元,用于当查找出所述信息列表中不存在所述动态链接库所在文件的文件信息,获取所述动态链接库所在文件的文件信息,将所述动态链接库所在文件的文件信息存储在所述信息列表中,设置所述动态链接库所在文件的文件信息在所述信息列表中的序号。
16.如权利要求10所述的装置,其特征在于,所述装置还包括:
过滤模块,用于根据所述执行单元对应的函数的函数信息构造所述执行单元对应的函数调用关系图之后,从所述执行单元对应的函数调用关系图中过滤系统函数及所述系统函数的调用关系。
17.如权利要求16所述的装置,其特征在于,所述过滤模块包括:
第一计算单元,用于计算所述执行单元对应的函数调用关系图中包括的函数的入度和出度,所述函数的入度为调用所述函数的函数的个数,所述函数的出度为所述函数调用的函数的个数;
第一过滤单元,用于过滤出度为零的系统函数及所述系统函数的调用关系,减少调用所述系统函数的函数的出度;
第二过滤单元,用于过滤入度为1且出度为1的系统函数及所述系统函数的调用关系,增加调用所述系统函数的函数和所述系统函数调用的函数之间的调用关系;
第二计算单元,用于根据所述函数调用关系图中包括的剩下函数的函数信息重新构建函数调用关系图,计算所述函数调用关系图包括的函数的出度和入度;
第三过滤单元,用于过滤入度为零的系统函数及所述系统函数的调用关系,以及减少所述系统调用的函数的入度。
18.如权利要求10所述的装置,其特征在于,所述装置还包括:
接收模块,用于接收开始时间和结束时间,在所述开始时间和所述结束时间之间设置记录标识为真;
所述第一获取模块,包括:
第五获取单元,用于当程序运行过程中调用函数时,对所述记录标识进行判断,如果所述记录标识为真,则获取所述函数的函数信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210523735.3A CN103853603B (zh) | 2012-12-07 | 2012-12-07 | 一种函数调用关系的获取方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210523735.3A CN103853603B (zh) | 2012-12-07 | 2012-12-07 | 一种函数调用关系的获取方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103853603A true CN103853603A (zh) | 2014-06-11 |
CN103853603B CN103853603B (zh) | 2018-03-13 |
Family
ID=50861292
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210523735.3A Active CN103853603B (zh) | 2012-12-07 | 2012-12-07 | 一种函数调用关系的获取方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103853603B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107102944A (zh) * | 2017-04-07 | 2017-08-29 | 北京深思数盾科技股份有限公司 | 一种调用函数的分析方法及装置 |
CN108228365A (zh) * | 2017-12-28 | 2018-06-29 | 杭州马猴烧韭科技有限公司 | 一种函数请求发送方法、函数请求调用方法及装置 |
CN116257457A (zh) * | 2023-05-15 | 2023-06-13 | 成都赛力斯科技有限公司 | 函数执行情况获取方法、装置、电子设备及可读存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101320350A (zh) * | 2008-07-17 | 2008-12-10 | 金蝶软件(中国)有限公司 | 一种性能监控方法及装置 |
US20090293049A1 (en) * | 2008-05-26 | 2009-11-26 | Ekaterina Gorelkina | Method for constructing dynamic call graph of application |
CN102722438A (zh) * | 2012-06-01 | 2012-10-10 | 北京神州绿盟信息安全科技股份有限公司 | 一种内核调试的方法和设备 |
CN102810078A (zh) * | 2011-06-02 | 2012-12-05 | 兰州大学 | 一种分析Linux内核动态执行的方法 |
-
2012
- 2012-12-07 CN CN201210523735.3A patent/CN103853603B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090293049A1 (en) * | 2008-05-26 | 2009-11-26 | Ekaterina Gorelkina | Method for constructing dynamic call graph of application |
CN101320350A (zh) * | 2008-07-17 | 2008-12-10 | 金蝶软件(中国)有限公司 | 一种性能监控方法及装置 |
CN102810078A (zh) * | 2011-06-02 | 2012-12-05 | 兰州大学 | 一种分析Linux内核动态执行的方法 |
CN102722438A (zh) * | 2012-06-01 | 2012-10-10 | 北京神州绿盟信息安全科技股份有限公司 | 一种内核调试的方法和设备 |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107102944A (zh) * | 2017-04-07 | 2017-08-29 | 北京深思数盾科技股份有限公司 | 一种调用函数的分析方法及装置 |
CN107102944B (zh) * | 2017-04-07 | 2020-01-24 | 北京深思数盾科技股份有限公司 | 一种调用函数的分析方法及装置 |
CN108228365A (zh) * | 2017-12-28 | 2018-06-29 | 杭州马猴烧韭科技有限公司 | 一种函数请求发送方法、函数请求调用方法及装置 |
CN108228365B (zh) * | 2017-12-28 | 2021-04-06 | 杭州马猴烧韭科技有限公司 | 一种函数请求发送方法、函数请求调用方法及装置 |
CN116257457A (zh) * | 2023-05-15 | 2023-06-13 | 成都赛力斯科技有限公司 | 函数执行情况获取方法、装置、电子设备及可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN103853603B (zh) | 2018-03-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110502357B (zh) | 一种栈回溯方法、装置、介质和设备 | |
CN109634587B (zh) | 一种生成入库脚本以及数据入库的方法和设备 | |
CN113296786B (zh) | 数据处理方法、装置、电子设备及存储介质 | |
CN106611044A (zh) | 一种sql优化方法及设备 | |
CN107015904B (zh) | 堆栈的保护方法及装置 | |
CN103019787A (zh) | 函数调用关系确定方法、热补丁升级方法及装置 | |
CN106354536A (zh) | 在Windows系统中加载Linux系统ELF文件的方法及装置 | |
CN112615758A (zh) | 一种应用识别方法、装置、设备及存储介质 | |
CN107544811B (zh) | IOS平台隐藏dylib文件的方法、存储介质、电子设备及系统 | |
CN103853603A (zh) | 一种函数调用关系的获取方法和装置 | |
CN116431520A (zh) | 测试场景确定方法、装置、电子设备和存储介质 | |
CN110659210A (zh) | 一种信息获取方法、装置、电子设备及存储介质 | |
US20130275954A1 (en) | Inter-procedural unreachable code elimination with use graph | |
CN113190576A (zh) | 数据处理方法、装置、计算机设备和可读存储介质 | |
CN107810474B (zh) | 大规模源代码存储库中的自动导入及依赖性 | |
WO2019071535A1 (zh) | 计算机存储介质、程序运行监测方法及装置 | |
CN107122247B (zh) | 一种静态占用图片的检测方法和装置 | |
CN109800273A (zh) | 一种数据处理的方法、装置、计算机存储介质及终端 | |
CN110764777B (zh) | 一种elf文件生成方法、elf文件、设备及存储介质 | |
CN105701162B (zh) | 一种智能终端的用户数据分区的管理方法及智能终端 | |
CN112003837B (zh) | 基于Modbus协议的设备智能适配方法、装置及存储介质 | |
CN114297256A (zh) | 一种租户系统资源量值的确定方法、系统及装置 | |
CN113190235A (zh) | 一种代码的分析方法、装置、电子终端及存储介质 | |
CN110297639B (zh) | 用于检测代码的方法和装置 | |
CN107357553A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |