CN110806968B - 应用程序运行信息获取方法及装置 - Google Patents
应用程序运行信息获取方法及装置 Download PDFInfo
- Publication number
- CN110806968B CN110806968B CN201810887434.6A CN201810887434A CN110806968B CN 110806968 B CN110806968 B CN 110806968B CN 201810887434 A CN201810887434 A CN 201810887434A CN 110806968 B CN110806968 B CN 110806968B
- Authority
- CN
- China
- Prior art keywords
- application program
- target
- target application
- statement block
- recording
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 254
- 230000002159 abnormal effect Effects 0.000 claims abstract description 32
- 239000003795 chemical substances by application Substances 0.000 claims description 31
- 238000012986 modification Methods 0.000 claims description 10
- 230000004048 modification Effects 0.000 claims description 10
- 239000000758 substrate Substances 0.000 claims 5
- 238000012545 processing Methods 0.000 abstract description 17
- 230000005856 abnormality Effects 0.000 description 5
- 230000006870 function Effects 0.000 description 3
- 239000000243 solution Substances 0.000 description 3
- 238000006243 chemical reaction Methods 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 238000013459 approach Methods 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 238000002347 injection Methods 0.000 description 1
- 239000007924 injection Substances 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3644—Software debugging by instrumenting at runtime
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请实施例公开了应用程序运行信息获取方法及装置,其中,将预置的代理工具注入到所述目标应用程序中;在所述目标应用程序的代码加载到内存的过程中,通过修改所述目标应用程序对应的字节码,将所述目标应用程序中目标方法的方法体加入到预置的语句块中,并用该语句块替换原方法体;语句块中包括异常处理结构体;在所述目标应用程序运行的过程中,利用所述语句块对所述目标应用程序进行栈录制,利用所述异常处理结构体捕获异常信息;输出录制结果。通过本申请实施例,能够更方便地获得程序运行过程中线程随着时间的推进的运行状况。
Description
技术领域
本申请涉及应用程序运行信息获取技术领域,特别是涉及应用程序运行信息获取方法及装置。
背景技术
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,使得Java语言具有功能强大和简单易用两个特征,因此广泛的应用于程序开发中。当一个程序代码编写完成之后,尤其是一些大的项目,通常需要查看程序运行的轨迹,已确定程序在运行过程中是否会发生问题,并针对问题对程序代码进行调整优化。
通常,在界面环境下,可以通过“debug”命令来单步调试,以检查内存中任何地方的字节以及修改任何地方的字节。但是在服务器环境下,或者对于逻辑很复杂,运行路径很长的程序而言,“debug”起来就非常耗时耗精力。
另一种方式下,可以通过jstack工具进行堆栈跟踪。其中,jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和nativestack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。但是,通过jstack工具,只能查看某一个线程在某个时刻的栈的情况,但是却无法知道线程随着时间的推进该怎样运行。
要想知道线程随着时间的推进是如何运行的,在现有技术中,需要在代码的每个需要监控的地方增加日志代码,代码繁琐,而且需要硬编码,不够方便灵活。
因此,如何更方便地获得程序运行过程中线程随着时间的推进的运行状况,成为需要本领域技术人员解决的技术问题。
发明内容
本申请提供了应用程序运行信息获取方法及装置,能够更方便地获得程序运行过程中线程随着时间的推进的运行状况。
本申请提供了如下方案:
一种应用程序运行信息获取方法,包括:
将预置的代理工具注入到目标应用程序中,以便通过所述代理工具执行以下处理:
在所述目标应用程序的代码加载到内存的过程中,通过修改所述目标应用程序对应的字节码,将所述目标应用程序中目标方法的方法体加入到预置的语句块中,并用该语句块替换原方法体;所述语句块中包括异常处理结构体;
在所述目标应用程序运行的过程中,利用所述语句块对所述目标应用程序进行栈录制,利用所述异常处理结构体捕获异常信息;
输出录制结果。
一种应用程序运行信息获取装置,
将预置的代理工具注入到所述目标应用程序中,所述代理工具包括:
字节码修改单元,用于在所述目标应用程序的代码加载到内存的过程中,通过修改所述目标应用程序对应的字节码,将所述目标应用程序中目标方法的方法体加入到预置的语句块中,并用该语句块替换原方法体;所述语句块中包括异常处理结构体;
栈录制单元,用于在所述目标应用程序运行的过程中,利用所述语句块对所述目标应用程序进行栈录制,利用所述异常处理结构体捕获异常信息;
录制结果输出单元,用于输出录制结果。
根据本申请提供的具体实施例,本申请公开了以下技术效果:
通过本申请实施例,可以通过提供代理工具的方式,在目标应用程序加载到内存的过程中,对字节码进行修改,从而使得代理工具能够获取到应用程序运行过程中的进栈出栈等相关信息。其中,为了使得在方法出现异常的情况下,也能够正常获得相关的信息,还可以将具体方法的方法体内容加入到预置的语句块中,再利用该语句块替换原来的方法体,并且可以在语句块中提供异常处理结构体,这样,即使运行过程中某方法出现异常,也能够通过异常处理结构体获得具体的异常信息,并体现在最终的栈记录结果中。因此,通过这种方式,可以在不需要修改目标应用程序原始代码的情况下,即可实现对应用程序运行过程中栈信息的记录,并且即使在运行过程中某方法出现异常,也能够正常捕获相应的异常信息,实现完整的信息记录,从而可以更方便地获得程序运行过程中线程随着时间的推进的运行状况。
当然,实施本申请的任一产品并不一定需要同时达到以上所述的所有优点。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的方法的流程图;
图2是本申请实施例提供的装置的示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本申请保护的范围。
在本申请实施例中,为了能够实现对应用程序运行轨迹的跟踪,可以利用ASM字节码技术来实现。ARM是一个全功能Java字节码操作与分析框架。可以用来修改已有的类文件或者直接以二进制形式动态生成类。它提供了通用转换与分析算法,自己组合复杂转换与代码分析工具。也就是说,对于一个Java应用程序而言,在启动运行之后,首先会将程序文件的代码加载到内存中,此时,会将原始代码转换为字节码;之后,再将字节码转换为机器可识别的机器代码,以使得程序能够被机器所执行。其中,ARM工具就可以在程序运行过程中,加载类的时候,动态修改字节码,操作类的具体行为,通过这种方式能够实现对程序运行过程的跟踪。
其中,现有技术中也存在使用ARM技术对应用程序的字节码进行修改的实现方式,例如,通常是直接在方法开始以及结尾处分别插入一行代码,用来监控方法的执行耗时等信息。但是,这种方式的缺点在于,一旦某个方法在执行过程中发生异常,这种方式将无法处理,或者,只能记录一个方法的开始时间,但是由于没有正常的“return”,而无法记录下结束的时间,等等。
为此,在本申请实施例中,使用了通过预置的语句块的方式来实现,并且,该语句块中可以包括异常处理结构体。在对应用程序字节码进行修改时,可以首先将程序中具体目标方法的方法体加入到该语句块中,再由该加入了方法体的语句块来替换原来的方法体,也即,将原来的方法体删除,将加入了原方法体内容的语句块作为目标方法的方法体。这样,目标方法具体在执行的过程中,就会首先调用该语句块的代码,然后,再由该语句块按照原来的方法体的内容,执行对原来方法体内的其他方法进行调用等处理。另外,语句块中还可以实现用于对应用程序的运行轨迹相关的内容进行记录的代码。这样,就可以在应用程序运行过程中,对具体的方法调用事件等进行记录,并且,即使某方法在运行过程中抛出异常,也可以捕获这种异常信息,并体现在最终的记录结果中。
下面对具体的实现方案进行详细介绍。
本申请实施例首先提供了一种应用程序运行信息获取方法,在该方法中,首先可以基于ARM技术实现代理工具,该代理工具可以实现关于字节码修改等相关功能。具体的,该代理工具可以提供给应用程序的开发者使用,在开发者完成一个应用程序的开发之后,如果需要进行运行调试等处理,则可以使用该代理工具。例如,在一种方式下,首先可以先定义一个classvisitor(asm中的),再来定义一个包含start和end静态无返回值的方法的类,然后再配置在premain中,最后打包成agent.jar,便可以生成一个代理工具,等等。
具体在使用上述代理工具,可以将预置的代理工具注入到所述目标应用程序中。具体的,可以在用于启动目标应用程序的命令行中通过预置参数,完成上述注入过程。例如,具体实现时,由于在运行一个目标应用程序时,通常是通过命令行来进行启动的,而这种命令行中是允许加入参数的。因此,本申请实施例就可以通过一个参数的方式,将具体的代理工具的信息体现在启动命令行中,之后,就可以将该代理工具注入到目标应用程序中。
例如,如果代理工具名称为agent.jar,则可以在目标应用程序的启动命令行,增加虚拟机参数中-noverify-Xbootclasspath/a:/agent.jar-javaagent:/agent.jar,即可把代理工具的相关代码加进去,并通过对字节码修改的方式,来实现后续的信息收集,而不需要改动应用程序的原始代码。
具体在引入代理工具后,参见图1,可以通过所述代理工具执行以下处理:
S101:在所述目标应用程序的代码加载到内存的过程中,通过修改所述目标应用程序对应的字节码,将所述目标应用程序中目标方法的方法体加入到预置的语句块中,并用该语句块替换原方法体;所述语句块中包括异常处理结构体;
由于在目标应用程序的启动命令行至增加了参数,引入了代理工具,因此,首先可以在目标应用程序加载过程中,执行对字节码的修改操作。具体的修改过程可以是,将所述目标应用程序中目标方法的方法体加入到预置的语句块(即static块)中,并用该加入了原方法体内容的语句块替换原方法体。例如,假设应用程序中包括某方法A,该方法下调用了方法B、C、D,关于对方法B、C、D进行调用相关的代码,就构成了方法A的方法体。在本申请实施例中,针对该方法A,就可以将该方法A的方法体加入到预置的语句块中。其中,具体的语句块也可以是一个方法,例如,可以称为方法E,假设方法E如下表示:
具体在对方法A的字节码进行修改时,就可以首先将方法A的方法体内容加入到上述“空洞”的部分,然后,再将加入了方法A的原方法体内容的方法E作为方法A的方法体。也就是说,修改之后的方法A可以表示为:
这样,执行到方法A时,就会首先调用方法E,使得本申请实施例中的代理工具接管后续的调用处理,也即,对方法B、C、D的调用可以由方法E接管,这样,方法B、C、D中在运行过程中的具体的情况,便可以被代理工具所获知。
其中,方法E中的开始方法M、结束方法N等部分,便可以实现代理工具的具体处理代码,例如包括用于采集方法耗时的代码,或者,用于记录方法内部调用轨迹的代码,用于统计方法内部的各级子事件的数量进行统计的代码,等等。如果上述各种代码都实现,则可以同时对上述各种信息进行记录。
其中的try-finally语句便可以是异常处理结构体,将这种结构体加入到语句块中后,可以使得即使在方法执行过程出现异常情况,也能够正常记录方法的具体运行情况信息。例如,通过catch语句来捕获具体的异常信息,等等。当然,在其他实现方式下,也可以通过其他语句来实现异常处理结构体。
需要说明的是,在具体实现时,可以针对应用程序中的每个方法,都分别进行上述对方法体的替换处理。也就是说,在前述例子中,方法A中调用下方法B、C、D,除了在将方法A的方法体加入到语句块中并进行替换之外,对于方法B、C、D也可以分别进行上述处理。并且,如果方法B还继续调用了方法F等等,也都可以分别进行上述处理。这样,可以分别获取到每个方法的信息,并方法调用过程中的层级关系,确定出方法调用的路径,另外,也可以统计出每个方法下的各级子事件的数量等信息,例如,方法A下包括多少一级子事件,多少二级子事件,等等。
另外需要说明的是,在实际应用中,具体的开发者也可以针对部分内容进行上述信息获取。也就是说,某开发者在开发了一个应用程序之后,具体在运行调试时,可能只关心其中一部分内容在运行过程中随时间变化的运行轨迹,其他的不需要关心。此时,还可以允许开发者在应用程序的原始代码中添加相应的标记,例如,在某个需要记录的段落开始以及结束的地方添加某个系统参数,等等。这样,代理工具在对字节码修改时,就可以将所述目标应用程序中目标段落内的目标方法的方法体加入到预置的语句块中,并用并用该语句块替换原方法体。
S102:在所述目标应用程序运行的过程中,利用所述语句块对所述目标应用程序进行栈录制,利用所述异常处理结构体捕获异常信息;
在加载过程中对字节码进行了修改之后,在应用程序运行过程中,就可以利用所述语句块对所述目标应用程序进行栈录制,并在某方法执行过程中发生异常时,利用所述异常处理结构体捕获异常信息。
其中,具体在进行栈录制时,可以对多种方面的信息进行录制,例如,可以利用所述语句块对每个方法的执行耗时进行统计。或者,还可以利用所述语句块对每个方法内部的方法调用轨迹进行记录,例如,某个方法A中调用了哪些方法,被调用的方法中是否还调用了其他方法,等等。另外,还可以利用所述语句块对每个方法内部的各级子事件的数量进行统计。其中,所述子事件具体就可以是指方法调用事件,例如,可以统计出某方法下一级子事件的数量,二级子事件的数量,等等。在此过程中,如果某方法在执行过程中抛出异常,则异常处理结构体便可以发挥作用,能够捕获到具体的异常信息。
S103:输出录制结果。
具体实现时,可以在目标应用程序运行结束后,输出具体的录制结果。其中,该结果可以通过预置格式的文件的形式输出。例如,一种具体的方式下,可以输出为XML格式的文件,这样,可以通过浏览器来打开该文件,以便查看具体应用程序在运行过程中的栈录制结果。其中,具体的栈录制结果可以包括各方法的执行耗时,或者方法内部的运行轨迹,例如,包括具体的类名,方法名,分层调用信息(利用这种方式来录制程序的方法入栈出栈信息,当这种以xml等形式呈现的时候,方法就会呈现层级调用的形式)等;另外还可以包括方法中的各级子事件的数量,等等。
总之,通过本申请实施例,可以通过提供代理工具的方式,在目标应用程序加载到内存的过程中,对字节码进行修改,从而使得代理工具能够获取到应用程序运行过程中的进栈出栈等相关信息。其中,为了使得在方法出现异常的情况下,也能够正常获得相关的信息,还可以将具体方法的方法体内容加入到预置的语句块中,再利用该语句块替换原来的方法体,并且可以在语句块中提供异常处理结构体,这样,即使运行过程中某方法出现异常,也能够通过异常处理结构体获得具体的异常信息,并体现在最终的栈记录结果中。因此,通过这种方式,可以在不需要修改目标应用程序原始代码的情况下,即可实现对应用程序运行过程中栈信息的记录,并且即使在运行过程中某方法出现异常,也能够正常捕获相应的异常信息,实现完整的信息记录,从而可以更方便地获得程序运行过程中线程随着时间的推进的运行状况。
与本申请实施例提供的应用程序运行信息获取方法相对应,本申请实施例还提供了一种应用程序运行信息获取装置,其中,
将预置的代理工具注入到所述目标应用程序中,所述装置应用于所述代理工具中,参见图2,包括:
字节码修改单元201,用于在所述目标应用程序的代码加载到内存的过程中,通过修改所述目标应用程序对应的字节码,将所述目标应用程序中目标方法的方法体加入到预置的语句块中,并用该语句块替换原方法体;所述语句块中包括异常处理结构体;
栈录制单元202,用于在所述目标应用程序运行的过程中,利用所述语句块对所述目标应用程序进行栈录制,利用所述异常处理结构体捕获异常信息;
录制结果输出单元203,用于输出录制结果。
具体实现时,所述栈录制单元具体用于:利用所述语句块对每个方法的执行耗时进行统计。
或者,所述栈录制单元具体用于:利用所述语句块对每个方法内部的方法调用轨迹进行记录。
或者,所述栈录制单元具体用于:利用所述语句块对每个方法内部的各级子事件的数量进行统计。
当然,具体实现时,也可以同时对上述各种信息进行统计。
其中,所述目标应用程序中还可以设有需要监控的目标段落标记点;
此时,所述字节码修改单元具体用于:将所述目标应用程序中目标段落内的目标方法的方法体加入到预置的语句块中,并用并用该语句块替换原方法体;
所述所述栈录制单元具体用于:利用所述语句块对所述目标段落内的各方法调用事件的相关信息进行统计。
具体的,所述应用程序包括Java应用程序;所述异常处理结构体包括try语句块,在某方法抛出异常时,通过执行catch语句,捕获异常信息。
通过本申请实施例提供的上述装置,可以通过提供代理工具的方式,在目标应用程序加载到内存的过程中,对字节码进行修改,从而使得代理工具能够获取到应用程序运行过程中的进栈出栈等相关信息。其中,为了使得在方法出现异常的情况下,也能够正常获得相关的信息,还可以将具体方法的方法体内容加入到预置的语句块中,再利用该语句块替换原来的方法体,并且可以在语句块中提供异常处理结构体,这样,即使运行过程中某方法出现异常,也能够通过异常处理结构体获得具体的异常信息,并体现在最终的栈记录结果中。因此,通过这种方式,可以在不需要修改目标应用程序原始代码的情况下,即可实现对应用程序运行过程中栈信息的记录,并且即使在运行过程中某方法出现异常,也能够正常捕获相应的异常信息,实现完整的信息记录,从而可以更方便地获得程序运行过程中线程随着时间的推进的运行状况。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的系统及系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上对本申请所提供的应用程序运行信息获取方法及装置,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本申请的限制。
Claims (12)
1.一种应用程序运行信息获取方法,其特征在于,包括:
将预置的代理工具注入到目标应用程序中,以便通过所述代理工具执行以下处理,所述应用程序包括Java应用程序:
在所述目标应用程序的代码加载到内存的过程中,通过Java字节码操控工具,修改所述目标应用程序对应的字节码,将所述目标应用程序中目标方法的方法体加入到预置的语句块的异常处理结构体中,并用该语句块替换原方法体;所述语句块中还包括用于对Java应用程序的运行轨迹相关的内容进行记录的代码;由Java虚拟机将修改后的字节码转换为机器代码;
在所述目标应用程序运行的过程中,由所述语句块按照所述原方法体的内容,执行所述目标方法,利用所述语句块中的所述代码对所述目标应用程序进行栈录制,包括:利用所述语句块中的所述代码对所述原方法体内的方法调用事件进行记录,利用所述异常处理结构体捕获异常信息;
输出录制结果,所述录制结果包括:所述目标应用程序在运行过程中线程随时间的推进的栈信息和所述异常信息,所述线程随时间的推进的栈信息包括方法调用事件。
2.根据权利要求1所述的方法,其特征在于,
所述利用所述语句块对所述目标应用程序进行栈录制,包括:
利用所述语句块对每个方法的执行耗时进行统计。
3.根据权利要求1所述的方法,其特征在于,
所述利用所述语句块对所述目标应用程序进行栈录制,包括:
利用所述语句块对每个方法内部的方法调用轨迹进行记录。
4.根据权利要求1所述的方法,其特征在于,
所述利用所述语句块对所述目标应用程序进行栈录制,包括:
利用所述语句块对每个方法内部的各级子事件的数量进行统计。
5.根据权利要求1所述的方法,其特征在于,
所述目标应用程序中还设有需要监控的目标段落标记点;
所述将所述目标应用程序中目标方法的方法体加入到预置的语句块中,包括:
将所述目标应用程序中目标段落内的目标方法的方法体加入到预置的语句块中,并用并用该语句块替换原方法体;
所述利用所述语句块对所述目标应用程序进行栈录制,包括:
利用所述语句块对所述目标段落内的各方法调用事件的相关信息进行统计。
6.根据权利要求1所述的方法,其特征在于,
所述异常处理结构体包括try语句块,在某方法抛出异常时,通过执行catch语句,捕获异常信息。
7.一种应用程序运行信息获取装置,其特征在于,
将预置的代理工具注入到目标应用程序中,所述应用程序包括Java应用程序,所述代理工具包括:
字节码修改单元,用于在所述目标应用程序的代码加载到内存的过程中,通过Java字节码操控工具,修改所述目标应用程序对应的字节码,将所述目标应用程序中目标方法的方法体加入到预置的语句块的异常处理结构体中,并用该语句块替换原方法体;所述语句块中还包括用于对Java应用程序的运行轨迹相关的内容进行记录的代码;由Java虚拟机将修改后的字节码转换为机器代码;
栈录制单元,用于在所述目标应用程序运行的过程中,由所述语句块按照所述原方法体的内容,执行所述目标方法,利用所述语句块中的所述代码对所述目标应用程序进行栈录制,包括:利用所述语句块中的所述代码对所述原方法体内的方法调用事件进行记录,利用所述异常处理结构体捕获异常信息;
录制结果输出单元,用于输出录制结果,所述录制结果包括:所述目标应用程序在运行过程中线程随时间的推进的栈信息和所述异常信息,所述线程随时间的推进的栈信息包括方法调用事件。
8.根据权利要求7所述的装置,其特征在于,
所述栈录制单元具体用于:利用所述语句块对每个方法的执行耗时进行统计。
9.根据权利要求7所述的装置,其特征在于,
所述栈录制单元具体用于:利用所述语句块对每个方法内部的方法调用轨迹进行记录。
10.根据权利要求7所述的装置,其特征在于,
所述栈录制单元具体用于:利用所述语句块对每个方法内部的各级子事件的数量进行统计。
11.根据权利要求7所述的装置,其特征在于,
所述目标应用程序中还设有需要监控的目标段落标记点;
所述字节码修改单元具体用于:将所述目标应用程序中目标段落内的目标方法的方法体加入到预置的语句块中,并用并用该语句块替换原方法体;
所述所述栈录制单元具体用于:利用所述语句块对所述目标段落内的各方法调用事件的相关信息进行统计。
12.根据权利要求7所述的装置,其特征在于,
所述应用程序包括Java应用程序;
所述异常处理结构体包括try语句块,在某方法抛出异常时,通过执行catch语句,捕获异常信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810887434.6A CN110806968B (zh) | 2018-08-06 | 2018-08-06 | 应用程序运行信息获取方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810887434.6A CN110806968B (zh) | 2018-08-06 | 2018-08-06 | 应用程序运行信息获取方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110806968A CN110806968A (zh) | 2020-02-18 |
CN110806968B true CN110806968B (zh) | 2024-04-09 |
Family
ID=69487124
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810887434.6A Active CN110806968B (zh) | 2018-08-06 | 2018-08-06 | 应用程序运行信息获取方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110806968B (zh) |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101477491A (zh) * | 2009-01-16 | 2009-07-08 | 杭州华三通信技术有限公司 | 一种统计函数运行状态的方法和装置 |
CN102422261A (zh) * | 2009-05-06 | 2012-04-18 | 微软公司 | 对所引起的异常的通知 |
CN104346148A (zh) * | 2013-07-30 | 2015-02-11 | 阿里巴巴集团控股有限公司 | 获取程序性能消耗信息的方法、装置及系统 |
CN104391787A (zh) * | 2014-11-13 | 2015-03-04 | 华为软件技术有限公司 | 一种针对目标方法的监控、热切入方法及装置 |
CN104765689A (zh) * | 2015-04-20 | 2015-07-08 | 广州华多网络科技有限公司 | 一种接口性能数据实时监制方法和装置 |
CN107168844A (zh) * | 2016-03-07 | 2017-09-15 | 中国移动通信集团河南有限公司 | 一种性能监控的方法及装置 |
CN108228461A (zh) * | 2018-01-08 | 2018-06-29 | 平安科技(深圳)有限公司 | 一种日志生成方法、装置、计算机设备及存储介质 |
CN108345542A (zh) * | 2018-02-28 | 2018-07-31 | 腾讯科技(深圳)有限公司 | 一种应用程序中异常处理方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7877740B2 (en) * | 2005-06-13 | 2011-01-25 | Hewlett-Packard Development Company, L.P. | Handling caught exceptions |
-
2018
- 2018-08-06 CN CN201810887434.6A patent/CN110806968B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101477491A (zh) * | 2009-01-16 | 2009-07-08 | 杭州华三通信技术有限公司 | 一种统计函数运行状态的方法和装置 |
CN102422261A (zh) * | 2009-05-06 | 2012-04-18 | 微软公司 | 对所引起的异常的通知 |
CN104346148A (zh) * | 2013-07-30 | 2015-02-11 | 阿里巴巴集团控股有限公司 | 获取程序性能消耗信息的方法、装置及系统 |
CN104391787A (zh) * | 2014-11-13 | 2015-03-04 | 华为软件技术有限公司 | 一种针对目标方法的监控、热切入方法及装置 |
CN104765689A (zh) * | 2015-04-20 | 2015-07-08 | 广州华多网络科技有限公司 | 一种接口性能数据实时监制方法和装置 |
CN107168844A (zh) * | 2016-03-07 | 2017-09-15 | 中国移动通信集团河南有限公司 | 一种性能监控的方法及装置 |
CN108228461A (zh) * | 2018-01-08 | 2018-06-29 | 平安科技(深圳)有限公司 | 一种日志生成方法、装置、计算机设备及存储介质 |
CN108345542A (zh) * | 2018-02-28 | 2018-07-31 | 腾讯科技(深圳)有限公司 | 一种应用程序中异常处理方法及装置 |
Non-Patent Citations (2)
Title |
---|
Android应用性能数据采集探针研究;马思峻;肖荣;成江伟;;计算机应用与软件(07);全文 * |
浅谈Java虚拟机异常处理;蓝滨;王征;;技术与市场(04);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN110806968A (zh) | 2020-02-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR102281827B1 (ko) | 프로그램 컨테이너 모니터링 | |
US9740594B2 (en) | Automated debug trace specification | |
US10621068B2 (en) | Software code debugger for quick detection of error root causes | |
Bielik et al. | Scalable race detection for android applications | |
US8156473B2 (en) | Model oriented debugging | |
US8756572B2 (en) | Debugger-set identifying breakpoints after coroutine yield points | |
CN110941528B (zh) | 一种基于故障的日志埋点设置方法、装置及系统 | |
US10489274B2 (en) | Using emulation to disassociate verification from stimulus in functional test | |
US10545852B2 (en) | Diagnostics of state transitions | |
US10496517B2 (en) | System and method for providing runtime diagnostics of executing applications | |
US8364691B2 (en) | Dynamic query-based debug point mapper | |
US20150006961A1 (en) | Capturing trace information using annotated trace output | |
US7596780B2 (en) | System and method for virtual catching of an exception | |
CN110806968B (zh) | 应用程序运行信息获取方法及装置 | |
CN112445706A (zh) | 程序异常代码获取方法、装置、电子设备以及存储介质 | |
JP2004094374A (ja) | ロギングシステム | |
Schuppan et al. | JVM independent replay in Java | |
US11106522B1 (en) | Process memory resurrection: running code in-process after death | |
CN117493209A (zh) | 基于剪枝算法的错误代码定位方法及其装置、电子设备 | |
Farrugia et al. | Towards a formalisation of erlang failure and failure detection | |
Pan et al. | Research on Dynamic Detection of Java Dependency Conflict | |
Livisianos et al. | Modern heap snapshots to the rescue of static analyses | |
Liu et al. | MuTT: A multi-threaded tracer for Java programs | |
Khan et al. | PASD: A Performance Analysis Approach Through the Statistical Debugging of Kernel Events | |
Chapman | Backstep: Incorporating Reverse-Execution into the Eclipse Java Debugger |
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 |