一种堆栈还原方法和计算机系统的制作方法

文档序号:8257926阅读:197来源:国知局
一种堆栈还原方法和计算机系统的制作方法
【技术领域】
[0001]本发明涉及计算机技术领域,特别涉及堆栈还原方法和计算机系统。
【背景技术】
[0002]函数调用堆栈是一个应用程序在运行的过程中,该应用程序的某个线程中按一定顺序调用的函数信息,通过还原堆栈即可知道该应用程序的某个线程中调用的函数信息包括函数名和位置信息等,这样应用程序的开发用户就可以知道该应用程序的信息,从而可以对该应用程序进行调试等操作。但是现有的堆栈还原方法中,有些函数比如一个应用程序特有的函数的信息并不能完全被还原出来,一般只还原出这些函数的内存地址,这样应用程序的开发用户就不能很好的对应用程序进行调试。

【发明内容】

[0003]本发明实施例提供堆栈还原方法和计算机系统,使得被调用的所有函数的信息都被还原出来,为用户的调试提供完整的函数信息。
[0004]本发明实施例提供一种堆栈还原方法,包括:
[0005]当计算机系统在运行应用程序时,获取所述应用程序对应的各个函数的名称和起始内存地址的对应关系;
[0006]获取所述应用程序的函数调用堆栈中第一函数的函数内存地址;
[0007]根据所述函数内存地址,及与所述函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,并根据所述对应关系确定所述第一函数的名称;
[0008]输出所述函数调用堆栈的信息,所述函数调用堆栈的信息中包括所述确定的第一函数的名称和偏移量。
[0009]本发明实施例提供一种计算机系统,包括:
[0010]对应关系获取单元,用于当计算机系统在运行应用程序时,获取所述应用程序对应的各个函数的名称和起始内存地址的对应关系;
[0011]内存地址获取单元,用于获取所述应用程序的函数调用堆栈中第一函数的函数内存地址;
[0012]函数信息确定单元,用于根据所述函数内存地址,及与所述函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,并根据所述对应关系确定所述第一函数的名称;
[0013]输出单元,用于输出所述函数调用堆栈的信息,所述函数调用堆栈的信息中包括所述确定的第一函数的名称和偏移量。
[0014]可见,本实施例的方法中,当计算机系统在运行应用程序时,该计算机系统会获取应用程序对应的各个函数的名称和起始内存地址的对应关系;并获取应用程序的函数调用堆栈中第一函数的函数内存地址;然后根据函数内存地址,及与函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,并根据对应关系确定第一函数的名称;最后输出函数调用堆栈的信息,函数调用堆栈的信息中包括确定的第一函数的名称和偏移量。这样可以将采用现有的方法获取的函数调用堆栈的信息中,未被符号化的函数的名称和偏移量还原出来,这样用户就可以知道函数调用堆栈中各个函数之间的层级关系,从而为用户的调试提供完整的函数信息。
【附图说明】
[0015]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0016]图1是本发明实施例提供的一种堆栈还原方法的流程图;
[0017]图2是本发明实施例提供的另一种堆栈还原方法的流程图;
[0018]图3是用调用线程打印的应用程序编程接口的方法获取的函数调用堆栈的信息的不意图;
[0019]图4是采用本实施例的方法获取的函数调用堆栈的信息的示意图;
[0020]图5是本发明实施例提供的一种计算机系统的结构示意图;
[0021]图6是本发明实施例提供的另一种计算机系统的结构示意图;
[0022]图7是本发明实施例中堆栈还原方法应用于的终端的结构示意图。
【具体实施方式】
[0023]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0024]本发明实施例提供一种堆栈还原方法,主要是当计算机系统在运行应用程序时,对该应用程序对应的函数调用堆栈进行还原,从而可以得到函数调用的层级结构,本实施例的方法是计算机系统所执行的方法,流程图如图1所示,包括:
[0025]步骤101,当计算机系统在运行应用程序时,获取应用程序对应的各个函数的名称和起始内存地址的对应关系。
[0026]可以理解,当计算机系统在运行应用程序时,需要先将应用程序的代码加载到对应的内存空间中,然后再调用代码中的各个函数来实现应用程序的运行,该应用程序的每个线程独立且对应一个函数调用堆栈,一个函数调用堆栈中包括一个线程在运行时按时间顺序所调用函数的信息,可以包括函数在内存空间中储存的地址即函数内存地址等,且该函数调用堆栈占用该应用程序对应的内存空间中的一部分。当需要还原一个函数调用堆栈时,可以由用户操作计算机系统,使得计算机系统发起对一个正在运行的应用程序中某个线程的函数调用堆栈的还原流程。
[0027]需要说明的是,应用程序的进程就是一个活跃着的应用程序,即将应用程序的代码放到对应的内存空间中,占有了一定的系统资源的应用程序,一个应用程序在没有被调用到内存空间之前叫做为程序,被调用并占用了资源后就可以称为进程,一个进程中可以由许多线程组成,每个应用程序对应一段内存空间。
[0028]计算机系统在获取各个函数的名称和起始内存地址时,可以从储存该应用程序的代码的内存空间获取,在实际实现的过程中,计算机系统采用可以先调用获取所有类的列表(objc_getClassList)函数,来获取应用程序对应的所有函数的名称;然后再调用某个类中所有方法(class_copyMethodList)函数来获取各个函数的具体信息,比如函数的起始内存地址等信息。这里起始内存地址是指函数指针所指向的地址,而函数指针是指向函数的指针变量,比如对于在函数赋值的代码中:
[0029]int func (int x) ;/* 声明一个函数 */
[0030]int (*f) (int x) ;/* 声明一个函数指针 */
[0031]f=func ;/*将func函数的首地址赋给指针f*/
[0032]其中,在进行赋值时,func代表函数的起始内存地址,指针f就指向函数func (x)代码的起始内存地址。
[0033]步骤102,获取应用程序的函数调用堆栈中第一函数的函数内存地址。
[0034]由于一个应用程序的进程可以包括多个线程,而一个线程对应一个函数调用堆栈,则如果用户需要对哪个线程进行调试,计算机系统可以根据用户需要来获取该线程对应的函数调用堆栈中函数的信息。具体地,计算机系统可以通过调用线程打印[NSThreadcallStackSymboIs]的应用程序编程接口(Applicat1n Programming Interface, API),获取到函数调用堆栈的信息,其中有些函数(比如计算机系统中系统库的函数)的信息被正确符号化,得到这些函数的偏移量和名称及该函数所属的应用程序的进程的名称等;而另一些函数(该应用程序特有的函数)的信息未被正确符号化,只能得到这些函数的函数内存地址和该函数所属的应用程序的进行的名称等。其中函数内存地址是该函数在内存空间中储存的地址。
[0035]这样计算机系统需要进一步地获取该未被正确符号化的函数(比如第一函数)的函数名称,这样用户才能确切地知道各个函数之间的调用顺序等信息,具体地,计算机系统可以通过正则语法分析或其它语法分析方法从获取到的函数调用堆栈的信息中,提取这些第一函数的函数内存地址。
[0036]步骤103,根据函数内存地址及与函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,并根据对应关系确定第一函数的名称。其中偏移量是指函数在内存空间中储存的地址与函数指针所指向的地址之间的距离。具体地,计算机系统可以用步骤102中获取的函数内存地址减去与该函数内存地址最近的起始内存地址,得到该函数内存地址对应的第一函数的偏移量;然后
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1