CN104572046A - 一种堆栈还原方法和计算机系统 - Google Patents
一种堆栈还原方法和计算机系统 Download PDFInfo
- Publication number
- CN104572046A CN104572046A CN201310486069.5A CN201310486069A CN104572046A CN 104572046 A CN104572046 A CN 104572046A CN 201310486069 A CN201310486069 A CN 201310486069A CN 104572046 A CN104572046 A CN 104572046A
- Authority
- CN
- China
- Prior art keywords
- function
- memory address
- storehouse
- information
- application program
- 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
Landscapes
- Stored Programmes (AREA)
Abstract
本发明实施例公开了堆栈还原方法和计算机系统,应用于计算机技术领域。当在运行应用程序时,计算机系统会获取应用程序对应的各个函数的名称和起始内存地址的对应关系;并获取应用程序的函数调用堆栈中第一函数的函数内存地址;然后根据函数内存地址,及与函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,并根据对应关系确定第一函数的名称;最后输出函数调用堆栈的信息,函数调用堆栈的信息中包括确定的第一函数的名称和偏移量。这样可以将采用现有的方法获取的函数调用堆栈的信息中,未被符号化的函数的名称和偏移量还原出来,这样用户就可以知道函数调用堆栈中各个函数之间的层级关系,从而为用户的调试提供完整的函数信息。
Description
技术领域
本发明涉及计算机技术领域,特别涉及堆栈还原方法和计算机系统。
背景技术
函数调用堆栈是一个应用程序在运行的过程中,该应用程序的某个线程中按一定顺序调用的函数信息,通过还原堆栈即可知道该应用程序的某个线程中调用的函数信息包括函数名和位置信息等,这样应用程序的开发用户就可以知道该应用程序的信息,从而可以对该应用程序进行调试等操作。但是现有的堆栈还原方法中,有些函数比如一个应用程序特有的函数的信息并不能完全被还原出来,一般只还原出这些函数的内存地址,这样应用程序的开发用户就不能很好的对应用程序进行调试。
发明内容
本发明实施例提供堆栈还原方法和计算机系统,使得被调用的所有函数的信息都被还原出来,为用户的调试提供完整的函数信息。
本发明实施例提供一种堆栈还原方法,包括:
当计算机系统在运行应用程序时,获取所述应用程序对应的各个函数的名称和起始内存地址的对应关系;
获取所述应用程序的函数调用堆栈中第一函数的函数内存地址;
根据所述函数内存地址,及与所述函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,并根据所述对应关系确定所述第一函数的名称;
输出所述函数调用堆栈的信息,所述函数调用堆栈的信息中包括所述确定的第一函数的名称和偏移量。
本发明实施例提供一种计算机系统,包括:
对应关系获取单元,用于当计算机系统在运行应用程序时,获取所述应用程序对应的各个函数的名称和起始内存地址的对应关系;
内存地址获取单元,用于获取所述应用程序的函数调用堆栈中第一函数的函数内存地址;
函数信息确定单元,用于根据所述函数内存地址,及与所述函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,并根据所述对应关系确定所述第一函数的名称;
输出单元,用于输出所述函数调用堆栈的信息,所述函数调用堆栈的信息中包括所述确定的第一函数的名称和偏移量。
可见,本实施例的方法中,当计算机系统在运行应用程序时,该计算机系统会获取应用程序对应的各个函数的名称和起始内存地址的对应关系;并获取应用程序的函数调用堆栈中第一函数的函数内存地址;然后根据函数内存地址,及与函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,并根据对应关系确定第一函数的名称;最后输出函数调用堆栈的信息,函数调用堆栈的信息中包括确定的第一函数的名称和偏移量。这样可以将采用现有的方法获取的函数调用堆栈的信息中,未被符号化的函数的名称和偏移量还原出来,这样用户就可以知道函数调用堆栈中各个函数之间的层级关系,从而为用户的调试提供完整的函数信息。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种堆栈还原方法的流程图;
图2是本发明实施例提供的另一种堆栈还原方法的流程图;
图3是用调用线程打印的应用程序编程接口的方法获取的函数调用堆栈的信息的示意图;
图4是采用本实施例的方法获取的函数调用堆栈的信息的示意图;
图5是本发明实施例提供的一种计算机系统的结构示意图;
图6是本发明实施例提供的另一种计算机系统的结构示意图;
图7是本发明实施例中堆栈还原方法应用于的终端的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供一种堆栈还原方法,主要是当计算机系统在运行应用程序时,对该应用程序对应的函数调用堆栈进行还原,从而可以得到函数调用的层级结构,本实施例的方法是计算机系统所执行的方法,流程图如图1所示,包括:
步骤101,当计算机系统在运行应用程序时,获取应用程序对应的各个函数的名称和起始内存地址的对应关系。
可以理解,当计算机系统在运行应用程序时,需要先将应用程序的代码加载到对应的内存空间中,然后再调用代码中的各个函数来实现应用程序的运行,该应用程序的每个线程独立且对应一个函数调用堆栈,一个函数调用堆栈中包括一个线程在运行时按时间顺序所调用函数的信息,可以包括函数在内存空间中储存的地址即函数内存地址等,且该函数调用堆栈占用该应用程序对应的内存空间中的一部分。当需要还原一个函数调用堆栈时,可以由用户操作计算机系统,使得计算机系统发起对一个正在运行的应用程序中某个线程的函数调用堆栈的还原流程。
需要说明的是,应用程序的进程就是一个活跃着的应用程序,即将应用程序的代码放到对应的内存空间中,占有了一定的系统资源的应用程序,一个应用程序在没有被调用到内存空间之前叫做为程序,被调用并占用了资源后就可以称为进程,一个进程中可以由许多线程组成,每个应用程序对应一段内存空间。
计算机系统在获取各个函数的名称和起始内存地址时,可以从储存该应用程序的代码的内存空间获取,在实际实现的过程中,计算机系统采用可以先调用获取所有类的列表(objc_getClassList)函数,来获取应用程序对应的所有函数的名称;然后再调用某个类中所有方法(class_copyMethodList)函数来获取各个函数的具体信息,比如函数的起始内存地址等信息。这里起始内存地址是指函数指针所指向的地址,而函数指针是指向函数的指针变量,比如对于在函数赋值的代码中:
int func(int x);/*声明一个函数*/
int(*f)(int x);/*声明一个函数指针*/
f=func;/*将func函数的首地址赋给指针f*/
其中,在进行赋值时,func代表函数的起始内存地址,指针f就指向函数func(x)代码的起始内存地址。
步骤102,获取应用程序的函数调用堆栈中第一函数的函数内存地址。
由于一个应用程序的进程可以包括多个线程,而一个线程对应一个函数调用堆栈,则如果用户需要对哪个线程进行调试,计算机系统可以根据用户需要来获取该线程对应的函数调用堆栈中函数的信息。具体地,计算机系统可以通过调用线程打印[NSThread callStackSymbols]的应用程序编程接口(Application Programming Interface,API),获取到函数调用堆栈的信息,其中有些函数(比如计算机系统中系统库的函数)的信息被正确符号化,得到这些函数的偏移量和名称及该函数所属的应用程序的进程的名称等;而另一些函数(该应用程序特有的函数)的信息未被正确符号化,只能得到这些函数的函数内存地址和该函数所属的应用程序的进行的名称等。其中函数内存地址是该函数在内存空间中储存的地址。
这样计算机系统需要进一步地获取该未被正确符号化的函数(比如第一函数)的函数名称,这样用户才能确切地知道各个函数之间的调用顺序等信息,具体地,计算机系统可以通过正则语法分析或其它语法分析方法从获取到的函数调用堆栈的信息中,提取这些第一函数的函数内存地址。
步骤103,根据函数内存地址及与函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,并根据对应关系确定第一函数的名称。其中偏移量是指函数在内存空间中储存的地址与函数指针所指向的地址之间的距离。具体地,计算机系统可以用步骤102中获取的函数内存地址减去与该函数内存地址最近的起始内存地址,得到该函数内存地址对应的第一函数的偏移量;然后将步骤101中获取的对应关系中与该函数内存地址最近的起始内存地址对应的函数名称,作为第一函数的名称。
步骤104,输出函数调用堆栈的信息,在函数调用堆栈的信息中包括步骤103中确定的第一函数的名称和偏移量,且还可以包括第一函数的函数内存地址,及其它函数的信息(比如名称、偏移量和函数内存地址)。由于通过现有的方法(比如上述调用线程打印的应用程序编程接口的方法)进行堆栈还原后获取的信息中,对于有些函数只能获取到函数内存地址,则需要通过上述步骤101到104来将这些函数的名称和偏移量获取到,并将这些函数的信息连通其它函数的信息输出,这样在还原出的函数调用堆栈的信息中,可以得知各个函数之间的层级关系,即各个函数之间相互调用的关系。
在具体实现的过程中,计算机系统可以先按照现有的方法调用线程打印的应用程序编程接口,获取函数调用堆栈的信息,并用第一函数即获取的函数调用堆栈的信息中未被正确符号化的函数的名称和偏移量,替换该函数调用堆栈的信息中这些函数的某些信息(可以是用户不关心的信息),比如函数内存地址到函数所属的进程起始内存地址(一个进程的起始地址)之间的距离。
需要说明的是,上述不厚101和102之间并没有绝对的顺序关系,可以同时执行,也可以顺序执行,图1中所述的只是其中一种具体的实现方法。且上述第一函数并不表示所有函数中的第一个函数,而是为了表示所有函数中的某些函数。
可见,本实施例的方法中,当计算机系统在运行应用程序时,该计算机系统会获取应用程序对应的各个函数的名称和起始内存地址的对应关系;并获取应用程序的函数调用堆栈中第一函数的函数内存地址;然后根据函数内存地址,及与函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,并根据对应关系确定第一函数的名称;最后输出函数调用堆栈的信息,函数调用堆栈的信息中包括确定的第一函数的名称和偏移量。这样可以将采用现有的方法获取的函数调用堆栈的信息中,未被符号化的函数的名称和偏移量还原出来,这样用户就可以知道函数调用堆栈中各个函数之间的层级关系,从而为用户的调试提供完整的函数信息。
参考图2所示,在一个具体的实施例中,计算机系统在执行上述堆栈还原的步骤之前,即在执行上述步骤101到104之前,可以先执行步骤105,即将堆栈还原的代码注入到正在运行的应用程序中,其中堆栈还原的代码包括上述步骤101到104中获取对应关系,获取函数内存地址,确定第一函数的名称和偏移量,及替换的代码。
具体地,计算机系统在执行代码注入时,可以通过任意方法注入,比如通过越狱插件来注入;也可以先确定该应用程序的进程所在的内存空间,并将堆栈还原的代码注入到该内存空间中,然后再触发计算机系统执行注入代码后的应用程序的进程;计算机系统还可以通过其它方法来注入堆栈还原的代码,在此不进行赘述。
以下以一个具体的实施例来说明本发明实施例所述的堆栈还原方法,当通过调用线程打印的应用程序编程接口的方法获取了函数调用堆栈的信息,具体函数调用堆栈的信息的示意图如图3所示,其中:
每一行表示被调用的一个函数的信息,包括该函数所属的进程名称,函数内存地址,且还可以包括函数名称和偏移量等,且行函数之间的排列可以表示各个行的函数被调用的时间顺序,比如图3中各个函数被调用的顺序为17->16->……2->1->0,而对于其中一行(比如第7行)的函数,函数所属的进程的名称为“SpringBoard”,而函数内存地址为“0x001ad8fb”;而对于另一行(比如第15行)的函数,函数所属的进程的名称为“UIKit”,函数名称为“UIApplicationMain”,偏移量为“1120”。
可见,上述有些函数未被正确符号化,即没有还原出这些函数的名称等信息,而只知道这些函数的函数内存地址,及函数所属进程的名称和函数内存地址到进程起始内存地址之间的距离,比如图3中第1到7行的函数,具体地,对于第3行的函数,进程的名称为“SpringBoard”,函数内存地址为“0x00174ee3”,函数内存地址到进程起始内存地址之间的距离为“1126115”,但是并不知道该函数的名称和偏移量等信息;而有些函数被正确符号化,可以知道这些函数的名称等信息。这样需要按照上述步骤101到104将图3中第1到7行的函数的名称和偏移量获取到,并输出函数调用堆栈的信息,其中可以包括图3中这些未被符号化的函数的函数内存地址、名称和偏移量,最终得到的函数调用堆栈的信息的示意图如图4所示。
例如最终输出的第3行函数的信息中包括函数的名称为“SBGestureRecognizer setState”,偏移量为170等。
本发明实施例还提供一种计算机系统,结构示意图如图5所示,包括:
对应关系获取单元10,用于当计算机系统在运行应用程序时,获取所述应用程序对应的各个函数的名称和起始内存地址的对应关系。
内存地址获取单元11,用于获取所述应用程序的函数调用堆栈中第一函数的函数内存地址。
函数信息确定单元12,用于根据所述内存地址获取单元11获取的函数内存地址,及与所述函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,并根据所述对应关系获取单元10获取的对应关系确定所述第一函数的名称。具体地,该函数信息确定单元12可以用所述函数内存地址减去与所述函数内存地址最近的起始内存地址得到所述函数内存地址对应的第一函数的偏移量;将所述对应关系中与所述函数内存地址最近的起始内存地址对应的函数名称,作为所述第一函数的名称。
输出单元13,用于输出所述函数调用堆栈的信息,所述函数调用堆栈的信息中包括所述函数信息确定单元12确定的第一函数的名称和偏移量。
输出单元13可以先按照现有的方法调用线程打印的应用程序编程接口,获取函数调用堆栈的信息,并用函数信息确定单元12确定的第一函数(即获取的函数调用堆栈的信息中未被正确符号化的函数)的名称和偏移量,替换该函数调用堆栈的信息中这些第一函数的某些信息(可以是用户不关心的信息),比如函数内存地址到函数所属的进程起始内存地址(一个进程的起始地址)之间的距离。
本实施例中,当计算机系统在运行应用程序时,对应关系获取单元10会获取应用程序对应的各个函数的名称和起始内存地址的对应关系;并由内存地址获取单元11获取应用程序的函数调用堆栈中第一函数的函数内存地址;然后函数信息确定单元12根据函数内存地址,及与函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,并根据对应关系确定第一函数的名称;最后替换单元13输出函数调用堆栈的信息,函数调用堆栈的信息中包括确定的第一函数的名称和偏移量。这样可以将采用现有的方法获取的函数调用堆栈的信息中,未被符号化的函数的名称和偏移量还原出来,这样用户就可以知道函数调用堆栈中各个函数之间的层级关系,从而为用户的调试提供完整的函数信息。
参考图6所示,在一个具体的实施例中,计算机系统除了可以包括如图5所示的结构外,还可以包括代码注入单元14,且其中的对应关系获取单元10可以通过第一调用单元110和第二调用单元210来实现,而内存地址获取单元11可以通过堆栈信息获取单元111和提取单元112来实现,具体地:
代码注入单元14,用于将堆栈还原的代码注入到所述应用程序中,所述堆栈还原的代码包括所述获取对应关系,获取函数内存地址,确定第一函数的名称和偏移量,及替换的代码。
具体地,该代码注入单元14具体可以通过注入单元140和触发单元141来实现,其中,注入单元140用于确定所述应用程序的进程所在的内存空间,并将所述堆栈还原的代码注入到所述确定的内存空间;触发单元141用于触发所述计算机系统执行所述注入单元140注入代码后的应用程序的进程。
第一调用单元110,用于调用获取所有类的列表函数,获取所述应用程序对应的所有函数的名称。
第二调用单元210,用于调用获取某个类中所有方法函数,获取所述所有函数中各个函数的起始内存地址。
堆栈信息获取单元111,用于调用线程打印的应用程序编程接口获取所述函数调用堆栈的信息。
提取单元112,用于在所述堆栈信息获取单元111获取的函数调用堆栈的信息中提取所述第一函数的函数内存地址,所述第一函数包括未被符号化的函数。
本实施例中,当代码注入单元14通过注入单元140和触发单元141将堆栈还原的代码注入到正在运行的应用程序后,就可以由对应关系获取单元10中的第一调用单元110和第二调用单元210来获取各个函数的名称和起始内存地址的对应关系,而内存地址获取单元11中的堆栈信息获取单元111和提取单元112来获取第一函数的函数内存地址;然后由函数信息确定单元12和输出单元13最终得到的函数调用堆栈中各个函数的信息都被正确的还原出来。
以下主要以本发明实施例的应用程序的进程启动方法应用于终端中来举例说明,该终端可以包括智能手机、平板电脑、电子书阅读器、动态影像专家压缩标准音频层面3(Moving Picture Experts Group Audio Layer III,MP3)播放器、动态影像专家压缩标准音频层面4(Moving Picture Experts GroupAudio Layer IV,MP4)播放器、膝上型便携计算机和台式计算机等等。
请参考图7,其示出了本发明实施例所涉及的终端的结构示意图,具体来讲:
终端可以包括射频(Radio Frequency,RF)电路20、包括有一个或一个以上计算机可读存储介质的存储器21、输入单元22、显示单元23、传感器24、音频电路25、无线保真(wireless fidelity,WiFi)模块26、包括有一个或者一个以上处理核心的处理器27、以及电源28等部件。本领域技术人员可以理解,图7中示出的终端结构并不构成对终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:
RF电路20可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,交由一个或者一个以上处理器27处理;另外,将涉及上行的数据发送给基站。通常,RF电路20包括但不限于天线、至少一个放大器、调谐器、一个或多个振荡器、用户身份模块(SIM)卡、收发信机、耦合器、低噪声放大器(Low Noise Amplifier,LNA)、双工器等。此外,RF电路20还可以通过无线通信与网络和其他设备通信。所述无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯系统(Global Systemof Mobile communication,GSM)、通用分组无线服务(General Packet RadioService,GPRS)、码分多址(Code Division Multiple Access,CDMA)、宽带码分多址(Wideband Code Division Multiple Access,WCDMA)、长期演进(Long Term Evolution,LTE)、电子邮件、短消息服务(Short Messaging Service,SMS)等。
存储器21可用于存储软件程序以及模块,处理器27通过运行存储在存储器21的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器21可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据终端的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器21可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器21还可以包括存储器控制器,以提供处理器27和输入单元22对存储器21的访问。
输入单元22可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。具体地,在一个具体的实施例中,输入单元22可包括触敏表面221以及其他输入设备222。触敏表面221,也称为触摸显示屏或者触控板,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触敏表面221上或在触敏表面221附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触敏表面221可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器27,并能接收处理器27发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触敏表面221。除了触敏表面221,输入单元22还可以包括其他输入设备222。具体地,其他输入设备222可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
显示单元23可用于显示由用户输入的信息或提供给用户的信息以及终端的各种图形用户接口,这些图形用户接口可以由图形、文本、图标、视频和其任意组合来构成。显示单元23可包括显示面板231,可选的,可以采用液晶显示器(Liquid Crystal Display,LCD)、有机发光二极管(OrganicLight-Emitting Diode,OLED)等形式来配置显示面板231。进一步的,触敏表面221可覆盖显示面板231,当触敏表面221检测到在其上或附近的触摸操作后,传送给处理器27以确定触摸事件的类型,随后处理器27根据触摸事件的类型在显示面板231上提供相应的视觉输出。虽然在图7中,触敏表面221与显示面板231是作为两个独立的部件来实现输入和输入功能,但是在某些实施例中,可以将触敏表面221与显示面板231集成而实现输入和输出功能。
终端还可包括至少一种传感器24,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板231的亮度,接近传感器可在终端移动到耳边时,关闭显示面板231和/或背光。作为运动传感器的一种,重力加速度传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于终端还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
音频电路25、扬声器251,传声器252可提供用户与终端之间的音频接口。音频电路25可将接收到的音频数据转换后的电信号,传输到扬声器251,由扬声器251转换为声音信号输出;另一方面,传声器252将收集的声音信号转换为电信号,由音频电路25接收后转换为音频数据,再将音频数据输出处理器27处理后,经RF电路20以发送给比如另一终端,或者将音频数据输出至存储器21以便进一步处理。音频电路25还可能包括耳塞插孔,以提供外设耳机与终端的通信。
WiFi属于短距离无线传输技术,终端通过WiFi模块26可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图7示出了WiFi模块26,但是可以理解的是,其并不属于终端的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
处理器27是终端的控制中心,利用各种接口和线路连接整个手机的各个部分,通过运行或执行存储在存储器21内的软件程序和/或模块,以及调用存储在存储器21内的数据,执行终端的各种功能和处理数据,从而对手机进行整体监控。可选的,处理器27可包括一个或多个处理核心;优选的,处理器27可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器27中。
终端还包括给各个部件供电的电源28(比如电池),优选的,电源可以通过电源管理系统与处理器27逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源28还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
尽管未示出,终端还可以包括摄像头、蓝牙模块等,在此不再赘述。具体在本实施例中,终端中的处理器27会按照如下的指令,执行存储器21中储存的一个或一个以上的应用程序的进程对应的可执行文件,从而实现各种功能:
当终端在运行应用程序时,获取所述应用程序对应的各个函数的名称和起始内存地址的对应关系;获取所述应用程序的函数调用堆栈中第一函数的函数内存地址;根据所述函数内存地址,及与所述函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,并根据所述对应关系确定所述第一函数的名称;输出所述函数调用堆栈的信息,所述函数调用堆栈的信息中包括所述确定的第一函数的名称和偏移量。这样可以将采用现有的方法获取的函数调用堆栈的信息中,未被符号化的函数的名称和偏移量还原出来,这样用户就可以知道函数调用堆栈中各个函数之间的层级关系,从而为用户的调试提供完整的函数信息。
其中,处理器27在获取上述对应关系时,具体可以调用获取所有类的列表函数,获取所述应用程序对应的所有函数的名称;调用获取某个类中所有方法函数,获取所述所有函数中各个函数的起始内存地址。
而当处理器27获取第一函数的函数内存地址时,具体可以调用线程打印的应用程序编程接口获取所述函数调用堆栈的信息;在所述函数调用堆栈的信息中提取所述第一函数的函数内存地址,所述第一函数包括未被符号化的函数。
当处理器27确定第一函数的偏移量和名称时,具体可以用所述函数内存地址减去与所述函数内存地址最近的起始内存地址得到所述函数内存地址对应的第一函数的偏移量;将所述对应关系中与所述函数内存地址最近的起始内存地址对应的函数名称,作为所述第一函数的名称。
进一步地,处理器27可以先将堆栈还原的代码注入到所述应用程序中,所述堆栈还原的代码包括所述获取对应关系,获取函数内存地址,确定第一函数的名称和偏移量,及替换的代码。具体地,先确定所述应用程序的进程所在的内存空间,并将所述堆栈还原的代码注入到所述确定的内存空间;并触发所述计算机系统执行所述注入代码后的应用程序的进程。然后再执行上述的堆栈还原的步骤。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM)、随机存取存储器(RAM)、磁盘或光盘等。
以上对本发明实施例所提供的堆栈还原方法和计算机系统进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (12)
1.一种堆栈还原方法,其特征在于,包括:
当计算机系统在运行应用程序时,获取所述应用程序对应的各个函数的名称和起始内存地址的对应关系;
获取所述应用程序的函数调用堆栈中第一函数的函数内存地址;
根据所述函数内存地址,及与所述函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,并根据所述对应关系确定所述第一函数的名称;
输出所述函数调用堆栈的信息,所述函数调用堆栈的信息中包括所述确定的第一函数的名称和偏移量。
2.如权利要求1所述的方法,其特征在于,所述获取所述应用程序对应的各个函数的名称和起始内存地址之前,还包括:
将堆栈还原的代码注入到所述应用程序中,所述堆栈还原的代码包括所述获取对应关系,获取函数内存地址,确定第一函数的名称和偏移量,及替换的代码。
3.如权利要求2所述的方法,其特征在于,所述将堆栈还原的代码注入到所述应用程序中,具体包括:
确定所述应用程序的进程所在的内存空间,并将所述堆栈还原的代码注入到所述确定的内存空间;
触发所述计算机系统执行所述注入代码后的应用程序的进程。
4.如权利要求1至3任一项所述的方法,其特征在于,所述获取所述应用程序对应的各个函数的名称和起始内存地址的对应关系,具体包括:
调用获取所有类的列表函数,获取所述应用程序对应的所有函数的名称;
调用获取某个类中所有方法函数,获取所述所有函数中各个函数的起始内存地址。
5.如权利要求1至3任一项所述的方法,其特征在于,所述获取所述应用程序的函数调用堆栈中第一函数的函数内存地址,具体包括:
调用线程打印的应用程序编程接口获取所述函数调用堆栈的信息;
在所述函数调用堆栈的信息中提取所述第一函数的函数内存地址,所述第一函数包括未被符号化的函数。
6.如权利要求1至3任一项所述的方法,其特征在于,所述根据所述函数内存地址,及与所述函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,具体包括:
用所述函数内存地址减去与所述函数内存地址最近的起始内存地址得到所述函数内存地址对应的第一函数的偏移量;
则所述根据所述对应关系确定所述第一函数的名称,具体包括:将所述对应关系中与所述函数内存地址最近的起始内存地址对应的函数名称,作为所述第一函数的名称。
7.一种计算机系统,其特征在于,包括:
对应关系获取单元,用于当计算机系统在运行应用程序时,获取所述应用程序对应的各个函数的名称和起始内存地址的对应关系;
内存地址获取单元,用于获取所述应用程序的函数调用堆栈中第一函数的函数内存地址;
函数信息确定单元,用于根据所述函数内存地址,及与所述函数内存地址最近的起始内存地址,确定对应第一函数的偏移量,并根据所述对应关系确定所述第一函数的名称;
输出单元,用于输出所述函数调用堆栈的信息,所述函数调用堆栈的信息中包括所述确定的第一函数的名称和偏移量。
8.如权利要求7所述的系统,其特征在于,还包括:
代码注入单元,用于将堆栈还原的代码注入到所述应用程序中,所述堆栈还原的代码包括所述获取对应关系,获取函数内存地址,确定第一函数的名称和偏移量,及替换的代码。
9.如权利要求8所述的系统,其特征在于,所述代码注入单元,具体包括:
注入单元,用于确定所述应用程序的进程所在的内存空间,并将所述堆栈还原的代码注入到所述确定的内存空间;
触发单元,用于触发所述计算机系统执行所述注入代码后的应用程序的进程。
10.如权利要求7至9任一项所述的系统,其特征在于,所述对应关系获取单元,具体包括:
第一调用单元,用于调用获取所有类的列表函数,获取所述应用程序对应的所有函数的名称;
第二调用单元,用于调用获取某个类中所有方法函数,获取所述所有函数中各个函数的起始内存地址。
11.如权利要求7至9任一项所述的系统,其特征在于,所述内存地址获取单元,具体包括:
堆栈信息获取单元,用于调用线程打印的应用程序编程接口获取所述函数调用堆栈的信息;
提取单元,用于在所述函数调用堆栈的信息中提取所述第一函数的函数内存地址,所述第一函数包括未被符号化的函数。
12.如权利要求7至9任一项所述的系统,其特征在于,
所述函数信息确定单元,具体用于用所述函数内存地址减去与所述函数内存地址最近的起始内存地址得到所述函数内存地址对应的第一函数的偏移量;将所述对应关系中与所述函数内存地址最近的起始内存地址对应的函数名称,作为所述第一函数的名称。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310486069.5A CN104572046B (zh) | 2013-10-16 | 2013-10-16 | 一种堆栈还原方法和计算机系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310486069.5A CN104572046B (zh) | 2013-10-16 | 2013-10-16 | 一种堆栈还原方法和计算机系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104572046A true CN104572046A (zh) | 2015-04-29 |
CN104572046B CN104572046B (zh) | 2019-01-11 |
Family
ID=53088221
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310486069.5A Active CN104572046B (zh) | 2013-10-16 | 2013-10-16 | 一种堆栈还原方法和计算机系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104572046B (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105843741A (zh) * | 2016-03-24 | 2016-08-10 | 腾讯科技(深圳)有限公司 | 应用程序的信息处理方法和装置 |
CN107943520A (zh) * | 2016-10-11 | 2018-04-20 | 腾讯科技(深圳)有限公司 | 应用堆栈信息获取方法及装置、堆栈信息解析方法及装置 |
CN108614763A (zh) * | 2016-12-09 | 2018-10-02 | 武汉斗鱼网络科技有限公司 | 一种应用的调试方法及装置 |
CN109478217A (zh) * | 2016-07-29 | 2019-03-15 | 高通股份有限公司 | 使用基于偏移的虚拟地址映射对目标应用功能的基于内核的检测 |
CN110286958A (zh) * | 2019-06-20 | 2019-09-27 | 腾讯科技(深圳)有限公司 | 节点信息获取方法、装置及存储介质 |
CN110618940A (zh) * | 2019-09-19 | 2019-12-27 | 腾讯科技(深圳)有限公司 | 堆栈信息追踪方法、装置、计算机可读介质及计算装置 |
CN110955548A (zh) * | 2019-11-07 | 2020-04-03 | 浙江口碑网络技术有限公司 | 数据处理方法及装置 |
CN111367588A (zh) * | 2018-12-25 | 2020-07-03 | 杭州海康威视数字技术股份有限公司 | 一种获取堆栈使用量的方法及装置 |
CN113032215A (zh) * | 2021-03-24 | 2021-06-25 | 北京字节跳动网络技术有限公司 | 线程快照解析方法、装置、设备和存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1728106A (zh) * | 2004-07-26 | 2006-02-01 | 中兴通讯股份有限公司 | 一种应用程序故障的定位方法 |
CN101446918A (zh) * | 2008-12-10 | 2009-06-03 | 中兴通讯股份有限公司 | 一种实现用户态调试器调试单个函数的方法及系统 |
CN101615136A (zh) * | 2009-06-26 | 2009-12-30 | 中兴通讯股份有限公司 | linux环境下快速转换调用堆栈地址的系统及方法 |
US20130054669A1 (en) * | 2011-08-24 | 2013-02-28 | Microsoft Corporation | Calling Functions Within A Deterministic Calling Convention |
-
2013
- 2013-10-16 CN CN201310486069.5A patent/CN104572046B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1728106A (zh) * | 2004-07-26 | 2006-02-01 | 中兴通讯股份有限公司 | 一种应用程序故障的定位方法 |
CN101446918A (zh) * | 2008-12-10 | 2009-06-03 | 中兴通讯股份有限公司 | 一种实现用户态调试器调试单个函数的方法及系统 |
CN101615136A (zh) * | 2009-06-26 | 2009-12-30 | 中兴通讯股份有限公司 | linux环境下快速转换调用堆栈地址的系统及方法 |
US20130054669A1 (en) * | 2011-08-24 | 2013-02-28 | Microsoft Corporation | Calling Functions Within A Deterministic Calling Convention |
Cited By (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105843741A (zh) * | 2016-03-24 | 2016-08-10 | 腾讯科技(深圳)有限公司 | 应用程序的信息处理方法和装置 |
CN109478217A (zh) * | 2016-07-29 | 2019-03-15 | 高通股份有限公司 | 使用基于偏移的虚拟地址映射对目标应用功能的基于内核的检测 |
CN109478217B (zh) * | 2016-07-29 | 2021-12-28 | 高通股份有限公司 | 使用基于偏移的虚拟地址映射对目标应用功能的基于内核的检测 |
CN107943520B (zh) * | 2016-10-11 | 2020-10-30 | 腾讯科技(深圳)有限公司 | 应用堆栈信息获取方法及装置、堆栈信息解析方法及装置 |
CN107943520A (zh) * | 2016-10-11 | 2018-04-20 | 腾讯科技(深圳)有限公司 | 应用堆栈信息获取方法及装置、堆栈信息解析方法及装置 |
CN108614763B (zh) * | 2016-12-09 | 2022-01-04 | 武汉斗鱼网络科技有限公司 | 一种应用的调试方法及装置 |
CN108614763A (zh) * | 2016-12-09 | 2018-10-02 | 武汉斗鱼网络科技有限公司 | 一种应用的调试方法及装置 |
CN111367588A (zh) * | 2018-12-25 | 2020-07-03 | 杭州海康威视数字技术股份有限公司 | 一种获取堆栈使用量的方法及装置 |
CN111367588B (zh) * | 2018-12-25 | 2023-05-16 | 杭州海康威视数字技术股份有限公司 | 一种获取堆栈使用量的方法及装置 |
CN110286958B (zh) * | 2019-06-20 | 2021-10-29 | 腾讯科技(深圳)有限公司 | 节点信息获取方法、装置及存储介质 |
CN110286958A (zh) * | 2019-06-20 | 2019-09-27 | 腾讯科技(深圳)有限公司 | 节点信息获取方法、装置及存储介质 |
CN110618940A (zh) * | 2019-09-19 | 2019-12-27 | 腾讯科技(深圳)有限公司 | 堆栈信息追踪方法、装置、计算机可读介质及计算装置 |
CN110618940B (zh) * | 2019-09-19 | 2024-02-06 | 腾讯科技(深圳)有限公司 | 堆栈信息追踪方法、装置、计算机可读介质及计算装置 |
CN110955548A (zh) * | 2019-11-07 | 2020-04-03 | 浙江口碑网络技术有限公司 | 数据处理方法及装置 |
CN113032215A (zh) * | 2021-03-24 | 2021-06-25 | 北京字节跳动网络技术有限公司 | 线程快照解析方法、装置、设备和存储介质 |
CN113032215B (zh) * | 2021-03-24 | 2024-05-28 | 北京字节跳动网络技术有限公司 | 线程快照解析方法、装置、设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN104572046B (zh) | 2019-01-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104572046A (zh) | 一种堆栈还原方法和计算机系统 | |
CN104978176B (zh) | 应用程序接口调用方法、装置及计算机可读存储介质 | |
CN106502703B (zh) | 一种函数调用方法和装置 | |
CN104978115A (zh) | 内容显示方法及装置 | |
CN103500002A (zh) | 应用程序管理的方法、装置及终端设备 | |
CN103942113A (zh) | 系统重启原因的检测方法、装置及终端设备 | |
CN104077184B (zh) | 一种应用程序的进程控制方法及计算机系统 | |
CN104423996B (zh) | 视图刷新方法和装置 | |
CN104571787A (zh) | 一种消息显示方法和通信终端 | |
CN103473092A (zh) | 一种下载应用的处理方法、装置及终端设备 | |
CN104063362A (zh) | 一种字符串截断方法及装置 | |
CN103473163A (zh) | 应用程序检测方法及装置 | |
CN104407804A (zh) | 截屏方法、装置及电子设备 | |
CN103455348A (zh) | 分区调整方法、装置、终端、服务器及系统 | |
CN104102500A (zh) | 一种应用程序的进程启动方法及计算机系统 | |
CN103177217B (zh) | 一种文件扫描方法、系统及客户端和服务器 | |
CN104133757A (zh) | 一种获取内存信息的方法及终端 | |
CN105302452A (zh) | 一种基于手势交互的操作方法及装置 | |
CN104133761A (zh) | 一种移动终端的内存占用分析方法、装置和系统 | |
CN103197944B (zh) | 一种应用程序的进程的性能确定方法和计算机系统 | |
CN104166646A (zh) | 一种输入统一资源定位符的方法和装置 | |
CN104133693B (zh) | 安装状态检测方法、装置及终端 | |
CN103677944A (zh) | 一种制作锁屏界面的方法、装置及终端设备 | |
CN103631592A (zh) | 一种显示资源的配置、调用方法、装置及设备 | |
CN104123210A (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 |