CN109871290A - 应用于Java的调用堆栈追踪方法、装置和存储介质 - Google Patents
应用于Java的调用堆栈追踪方法、装置和存储介质 Download PDFInfo
- Publication number
- CN109871290A CN109871290A CN201910172580.5A CN201910172580A CN109871290A CN 109871290 A CN109871290 A CN 109871290A CN 201910172580 A CN201910172580 A CN 201910172580A CN 109871290 A CN109871290 A CN 109871290A
- Authority
- CN
- China
- Prior art keywords
- called
- thread
- chain table
- ltsh chain
- value
- 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
- Debugging And Monitoring (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本申请公开了应用于Java的调用堆栈追踪方法、装置和存储介质,涉及堆栈追踪领域,用以解决现有技术中当跨线程调用或异步调用出现异常时,堆栈只能打印当前线程调用关系,无法跟踪到原始发起调用的线程的问题。该方法中,通过在调用待调用对象之前获取调用堆栈,并根据获取的调用堆栈生成待调用对象的哈希链表。若确定存在上一个调用堆栈,则将生成的哈希链表与之前生成的哈希链表进行关联。这样,通过将各待调用对象的哈希链表进行关联使得在跨线程调用或异步调用出现异常时,可以通过哈希链表跟踪到原始发起调用的线程,从而极大提升了研发测试人员解决问题的效率。
Description
技术领域
本申请涉及堆栈追踪领域,尤其涉及应用于Java的调用堆栈追踪方法、装置和存储介质。
背景技术
堆栈追踪是对程序运行过程中的某个时间点上活跃栈帧信息的描述。程序员通常在交互式调试或者事发后调试中使用堆栈追踪。在线程调用出现异常时,可通过堆栈追踪来确定出现的问题。
而在现有的java多线程应用中,因为java语言所提供的能力限制,当跨线程调用或异步调用出现异常时,堆栈只能打印当前线程调用关系,无法跟踪到原始发起调用的线程。
发明内容
本申请实施例提供一种应用于Java的调用堆栈追踪方法、装置和存储介质,用于解决现有技术中当跨线程调用或异步调用出现异常时,堆栈只能打印当前线程调用关系,无法跟踪到原始发起调用的线程的问题。
第一方面,本申请实施例提供一种应用于Java的调用堆栈追踪方法,该方法包括:
在调用待调用对象之前,获取调用堆栈;其中,所述调用包括跨线程调用和异步调用;
若不存在上一个调用堆栈,则生成所述待调用对象的哈希(hash)链表,该哈希链表中key为所述待调用对象的hash值,value值为node信息,所述node信息中至少包括所述待调用对象的引用以及后继node指针;
若存在上一个调用堆栈,则生成所述待调用对象的哈希链表,并将生成的哈希链表与之前生成的哈希链表进行关联。
第二方面,本申请实施例提供一种应用于Java的调用堆栈追踪管控装置,所述装置包括:
获取模块,用于在调用待调用对象之前,获取调用堆栈;其中,所述调用包括跨线程调用和异步调用;
生成模块,用于若不存在上一个调用堆栈,则生成所述待调用对象的哈希链表,该哈希链表中key为所述待调用对象的hash值,value值为node信息,所述node信息中至少包括所述待调用对象的引用以及后继node指针;
关联模块,用于若存在上一个调用堆栈,则生成所述待调用对象的哈希链表,并将生成的哈希链表与之前生成的哈希链表进行关联。
本申请另一实施例还提供了一种计算装置,包括至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行本申请实施例提供的任一应用于Java的调用堆栈追踪方法。
本申请另一实施例还提供了一种计算机存储介质,其中,所述计算机存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行本申请实施例中的任一应用于Java的调用堆栈追踪方法。
本申请实施例提供的一种应用于Java的调用堆栈追踪方法、装置和存储介质。该方法中,通过在调用待调用对象之前获取调用堆栈,并根据获取的调用堆栈生成待调用对象的哈希链表。若确定存在上一个调用堆栈,则将生成的哈希链表与之前生成的哈希链表进行关联。这样,通过将各待调用对象的哈希链表进行关联使得在跨线程调用或异步调用出现异常时,可以通过哈希链表跟踪到原始发起调用的线程。
本申请的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本申请而了解。本申请的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本申请实施例中的应用于Java的调用堆栈追踪方法的流程示意图;
图2为本申请实施例中同一个待调用对象多次执行跨进程调用的示意图;
图3为本申请实施例中的哈希链表示意图;
图4为本申请实施例中的跨线程调用的流程示意图;
图5为本申请实施例中的最终堆栈结果示意图一;
图6为本申请实施例中的异步调用的流程示意图;
图7为本申请实施例中的最终堆栈结果示意图二;
图8为本申请实施例中的应用于Java的调用堆栈追踪管控装置的结构示意图;
图9为根据本申请实施方式的计算装置的结构示意图。
具体实施方式
为了在跨线程调用或异步调用出现异常时,通过堆栈跟踪到原始发起调用线程,本申请实施例中提供一种应用于Java的调用堆栈追踪方法、装置和存储介质。为了更好的理解本申请实施例提供的技术方案,这里对该方案涉及的名词做一下简单说明:
面向切面编程(AOP,Aspect Oriented Programming):通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。可通过AOP技术在调用待调用对象前后获取调用堆栈。
cause机制:Java语言内建的一种异常回溯机制,每一层捕捉到异常的代码,都可以新建一个异常(通常用于添加信息)并将捕捉到的异常设置为cause,这样最外层捕捉到异常的代码可以通过遍历cause回溯出完整的异常链表。
本申请实施例中,通过在调用待调用对象之前获取调用堆栈,并根据获取的调用堆栈生成待调用对象的哈希链表。若确定存在上一个调用堆栈,则将生成的哈希链表与之前生成的哈希链表进行关联。这样,通过将各待调用对象的哈希链表进行关联使得在跨线程调用或异步调用出现异常时,调用堆栈可以跟踪到原始发起调用的线程,从而极大提升了研发测试人员解决问题的效率。
下面结合附图对本申请实施例提供的一种应用于Java的调用堆栈追踪方法做进一步说明。图1为应用于Java的调用堆栈追踪方法的流程示意图,包括以下步骤:
步骤101:在调用待调用对象之前,获取调用堆栈;其中,所述调用包括跨线程调用和异步调用。
步骤102:若不存在上一个调用堆栈,则生成所述待调用对象的哈希链表,该哈希链表中key为所述待调用对象的hash值,value值为node信息,所述node信息中至少包括所述待调用对象的引用以及后继node指针。
其中,待调用对象的引用包括但不限于:弱引用、软引用以及强引用。较佳的,为了规避逻辑问题,便于内存回收清理,优先采用弱引用。
步骤103:若存在上一个调用堆栈,则生成所述待调用对象的哈希链表,并将生成的哈希链表与之前生成的哈希链表进行关联。
这样,通过将各待调用对象的哈希链表进行关联使得在跨线程调用或异步调用出现异常时,可以通过哈希链表跟踪到原始发起调用的线程,从而极大提升了研发测试人员解决问题的效率。
在本申请实施例中,获取调用堆栈可通过构建异常对象或通过获取调用堆栈函数java.lang.Thread.getStackTrace()来获取。下面对通过构建异常对象获取调用堆栈做进一步的说明。
通过AOP机制,可以在调用待调用对象之前进行获取异常对象的操作,步骤101具体可实施为基于AOP机制,在调用待调用对象之前捕获预先构造的异常对象,该异常对象中包括所述调用堆栈。其中,预先构造的异常对象可以是由线程构造的。
在AOP机制中,如需要在待调用对象执行前后进行获取调用堆栈,那么就需要捕捉该方法,这些方法也称为目标方法,最后还定义了两个通知,通知就是那些需要在目标方法前后执行的函数,如before()即前置通知在目标方法之前执行,即在待调用对象执行前进行获取调用堆栈,另一个是after()即后置通知,在待调用对象之后执行,如进行日志记录。
通过构造异常对象,实现了通过cause机制实现堆栈的关联操作,当运行调用对象的方法出现异常时,通过cause机制可以将该异常和堆栈的关联关系一同打印出来。
前述的查找上一个调用堆栈具体可实施为查找上一个异常对象,若查找到上一个异常对象,则确定查找到上一个调用堆栈;若未查找到上一个异常对象,则确定未查找到上一个调用堆栈。这样,通过AOP机制获取由线程构造的异常对象,可以使查找调用堆栈的操作更简单。
在本申请实施例中,可以通过cause机制对查找的上一个异常对象进行设置,具体可实施为若查找到上一个异常对象,则根据Java的异常机制将上一异常对象设置为生成的所述异常对象的cause。这样,通过cause机制将各异常对象关联在一起,可以在生成异常记录时将各异常对象关联到一起。
进一步的,为了可以更加简单快速的查找上一个异常对象,本申请实施例中,可以通过确定用于存储异常对象的第二线程局部变量来确定是否有上一个异常对象。具体可实施为步骤A1-A5:
步骤A1:声明用于存储异常对象的第二线程局部变量,其初始值为空。
步骤A2:执行待调用对象的方法时,将所述第二线程局部变量的值更新为调用执行的待调用对象之前对应生成的异常对象。
步骤A3:读取所述第二线程局部变量。
步骤A4:若所述第二线程局部变量的值不为空,则确定查找到上一个异常对象。
步骤A5:若所述第二线程局部变量的值为空,则确定未查找到上一个异常对象。
上面介绍了如何获取调用堆栈,下面对如何生成哈希链表做进一步的说明。在本申请实施例中,若限定调用场景为跨线程调用,则哈希链表中还包括抛出线程的线程ID。在生成待调用对象的哈希链表之前,需要确定当前线程ID与所述抛出线程ID是否相同。若相同,则不为跨线程调用,进而无需进行后续处理,若当前线程ID和抛出线程ID不同,则为跨线程调用,则需要进行后续处理。这样,通过线程ID的比对即可实现跨线程调用场景的限定。
进一步的,当在跨线程调用的场景下,可以通过记录调用线程的线程局部变量来解决在同一线程执行过程中的重复记录,具体可实施为:在执行所述待调用对象之前,设置用于记录调用线程的第一局部变量的变量值为调用线程的线程局部变量;并,在执行完所述待调用对象时,将所述第一局部变量置空;确定调用线程的线程局部变量为空。例如,在线程2上执行逻辑操作时,确定第一局部变量的变量值是否为空,若为空,则生成哈希链表,同时为第一局部变量赋值。若在该线程2上还需要执行嵌套的逻辑操作,在判断第一局部变量的变量值是否为空时会发现第一局部变量已经被赋值,因此便不再生成哈希链表。这样,可以去除同一线程执行过程中出现的重复记录,避免产生大量无用的异常层级。
在本申请实施例中,根据所述哈希链表中的hash值以及调用堆栈的MD5值可以解决同一个待调用对象多次执行跨进程调用的操作,其中,根据调用堆栈的MD5值相对采用原始的堆栈表达字符串较长的问题,MD5可以快速的确定调用堆栈。具体可实施为步骤B1-B4:
步骤B1:确定所述待调用对象的hash值,并确定所述调用堆栈的MD5值。
步骤B2:确定hash值和MD5值是否同时存在于之前生成的同一哈希链表中;若是,则执行步骤B3;若否,则执行步骤B4。
步骤B3:构建一个嵌套执行所述待调用对象的新对象,并生成该新对象的哈希链表作为所述待调用对象的哈希链表。
步骤B4:根据确定的hash值和MD5值得到所述待调用对象的哈希链表。
在本申请实施例中,同一个待调用对象多次执行跨进程调用的操作会产生多个哈希链表,然而同一个待调用对象的hash值是唯一的,而获取的调用堆栈则不相同。根据确定的hash值和MD5值可以唯一确定待调用对象执行的跨进程调用的时机。如图2所示,为同一个待调用对象多次执行跨进程调用的示意图。其中,Runnable对象是Java语言内建的可执行体接口,主要用于定义可被线程执行的任务对象,Run方法为待调用对象执行跨进程调用所使用的方法。在图2中,Runnable1对象与Runnable2对象的hash值相同,Runnable1对象执行Run方法并存储到Runnable1-hash堆栈中,而Runnable2对象通过嵌套执行Runnable1对象的Run方法,存储到Runnable2-hash堆栈中。从而实现了同一个待调用对象多次执行跨进程调用的操作。
如图3所示,为哈希链表的结构示意图。其中,哈希链表中的key为待调用对象的hash值,value值为node信息。其中,node信息包括但不限于待调用对象的引用、后继node指针、调用堆栈的MD5值、构造的异常对象以及抛出线程的线程ID等。根据哈希链表实现了堆栈的关联。
为便于系统性理解本申请实施例提供的技术方案,下面通过具体的例子对此进行进一步说明,本方案为跨线程调用时堆栈追踪的情况。如图4所示,其中,线程1调用线程2,线程2调用线程3,包括以下步骤:
步骤401:初始化第一局部变量和第二线程局部变量,初始值为空。
步骤402:在线程1上调用待调用对象之前捕获预先构造的异常对象1,该异常对象中包括调用堆栈。
步骤403:读取用于存储异常对象的第二线程局部变量是否为空;以及读取用于记录调用线程的第一局部变量是否为空。
步骤404:确定第二线程局部变量的值为空,第一局部变量的值为空,生成所述待调用对象的哈希链表,并将第二线程局部变量的值更新为异常对象1。
步骤405:发起跨线程调用将待调用对象调用到线程2上,并确定线程2与线程1的ID不同。
步骤406:在线程2上调用待调用对象之前捕获预先构造的异常对象2。
步骤407:读取第二线程局部变量是否为空;以及读取第一局部变量是否为空。
步骤408:确定第二线程局部变量不为空,确定第一局部变量为空,将异常对象1设置为异常对象2的cause,并生成所述待调用对象的哈希链表,并将生成的哈希链表与在线程1上生成的哈希链表进行关联;将第二线程局部变量的值更新为异常对象2,将第一局部变量的值更新不为空。
步骤409:确定所述待调用对象的hash值,并确定所述调用堆栈的MD5值。
步骤410:确定hash值和MD5值是否同时存在于之前生成的同一哈希链表中。
步骤411:确定同时存在,构建一个嵌套执行所述待调用对象的新对象,并生成该新对象的哈希链表作为所述待调用对象的哈希链表。
步骤412:在执行调用对象过程中捕获到异常对象时,确定第二线程局部变量不为空,确定第一局部变量不为空,不生成哈希链表;将第一局部变量置空。
步骤413:发起跨线程调用将待调用对象调用到线程3上,并确定线程3与线程2的ID不同。
步骤414:在线程3上调用待调用对象之前捕获预先构造的异常对象3。
步骤415:读取第二线程局部变量是否为空;以及读取第一局部变量是否为空。
步骤416:确定第二线程局部变量不为空,确定第一局部变量为空,将异常对象2设置为异常对象3的cause,并生成所述待调用对象的哈希链表,并将生成的哈希链表与在线程2上生成的哈希链表进行关联;并将第二线程局部变量的值更新为异常对象3。
步骤417:执行出现异常对象4,读取第二线程局部变量是否为空;以及读取第一局部变量是否为空。
步骤418:确定第二线程局部变量不为空,确定第一局部变量为空,将异常对象3设置为执行出现的异常对象4的cause;并将异常堆栈附加到线程3的调用堆栈上;并将第二线程局部变量的值更新为异常对象4。
需要说明的是,步骤404、步骤416生成的哈希链表操作与步骤409-步骤411生成的哈希链表的操作是相同的,步骤409-步骤411为举例说明。
根据上述步骤,最终堆栈结果如图5所示。其中线程1的调用堆栈在最下面,线程2的调用堆栈在线程1上面,线程3的调用堆栈在线程2上面。
在介绍完了跨线程调用时堆栈追踪的情况,下面对异步调用时堆栈追踪的情况做进一步的说明,如图6所示,包括以下步骤:
步骤601:执行异步调用对象前,初始化第二线程局部变量,初始值为空。
步骤602:在线程上调用待调用对象之前捕获预先构造的异常对象1,该异常对象中包括调用堆栈。
步骤603:读取用于存储异常对象的第二线程局部变量是否为空。
步骤604:确定第二线程局部变量的值为空,生成所述待调用对象的哈希链表,并将第二线程局部变量的值更新为异常对象1。
步骤605:执行异步调用对象过程中,在线程上调用待调用对象之前捕获预先构造的异常对象2。
步骤606:读取第二线程局部变量是否为空。
步骤607:确定第二线程局部变量不为空,将异常对象1设置为异常对象2的cause,并生成所述待调用对象的哈希链表,并将生成的哈希链表与在之前线程上生成的哈希链表进行关联;将第二线程局部变量的值更新为异常对象2。
步骤608:确定所述待调用对象的hash值,并确定所述调用堆栈的MD5值。
步骤609:确定hash值和MD5值是否同时存在于之前生成的同一哈希链表中。
步骤610:确定同时存在,构建一个嵌套执行所述待调用对象的新对象,并生成该新对象的哈希链表作为所述待调用对象的哈希链表。
步骤611:执行出现异常对象3,读取第二线程局部变量是否为空。
步骤612:确定第二线程局部变量不为空,将异常对象2设置为执行出现的异常对象3的cause;并将异常堆栈附加到线程的调用堆栈上;并将第二线程局部变量的值更新为异常对象3。
根据上述步骤,最终堆栈结果如图7所示。其中线程1中抛出异步调用时的调用堆栈在最下面,线程1中异步调用执行到异常时的堆栈在上面。
需要说明的是,跨线程调用与异步调用的差别仅在于确定当前线程ID与所述抛出线程ID是否相同,若线程ID相同,则为异步调用;若线程ID不同,则为跨线程调用。
基于相同的发明构思,本申请实施例还提供一种应用于Java的调用堆栈追踪管控装置。如图8所示,该装置包括:
获取模块801,用于在调用待调用对象之前,获取调用堆栈;其中,所述调用包括跨线程调用和异步调用;
生成模块802,用于若不存在上一个调用堆栈,则生成所述待调用对象的哈希链表,该哈希链表中key为所述待调用对象的hash值,value值为node信息,所述node信息中至少包括所述待调用对象的引用以及后继node指针;
关联模块803,用于若存在上一个调用堆栈,则生成所述待调用对象的哈希链表,并将生成的哈希链表与之前生成的哈希链表进行关联。
进一步的,所述哈希链表中还包括异常对象;获取模块801包括:
构造单元,用于基于AOP机制,在调用待调用对象之前捕获预先构造的异常对象,该异常对象中包括所述调用堆栈;
进一步的,所述装置还包括:
查找模块,用于查找上一个调用堆栈。
进一步的,查找模块包括:
查找单元,用于查找上一个异常对象;
查找到单元,用于若查找到上一个异常对象则确定查找到上一个调用堆栈;
未查找到单元,用于若未查找到上一个异常对象则确定未查找到上一个调用堆栈。
进一步的,所述装置还包括:
第一设置模块,用于若查找到上一个异常对象,则根据Java的异常机制将上一异常对象设置为生成的所述异常对象的cause。
进一步的,所述哈希链表中还包括抛出线程的线程ID;所述装置还包括:
确定模块,用于生成模块802和关联模块803生成所述待调用对象的哈希链表之前,确定当前线程ID与所述抛出线程ID不同。
进一步的,所述装置还包括:
第二设置模块,用于在执行所述待调用对象之前,设置用于记录调用线程的第一局部变量的变量值为调用线程的线程局部变量;
置空模块,用于在执行完所述待调用对象时,将所述第一局部变量置空;
第二确定模块,用于第一设置模块根据Java的异常机制将上一异常对象设置为生成的所述异常对象的cause之前,确定调用线程的线程局部变量为空。
进一步的,生成模块802和关联模块803包括:
第一确定单元,用于确定所述待调用对象的hash值,并确定所述调用堆栈的MD8值;
第二确定单元,用于确定hash值和MD8值是否同时存在于之前生成的同一哈希链表中;
构建单元,用于若是,构建一个嵌套执行所述待调用对象的新对象,并生成该新对象的哈希链表作为所述待调用对象的哈希链表;
获取单元,用于若否,则根据确定的hash值和MD8值得到所述待调用对象的哈希链表。
进一步的,所述待调用对象的引用为弱引用。
进一步的,所述装置还包括:
声明模块,用于声明用于存储异常对象的第二线程局部变量,其初始值为空;
更新模块,用于执行待调用对象的方法时,将所述第二线程局部变量的值更新为调用执行的待调用对象之前对应生成的异常对象;
查找模块包括:
读取单元,用于读取所述第二线程局部变量;
不为空单元,用于若所述第二线程局部变量的值不为空,则确定查找到上一个异常对象;
空单元,用于若所述第二线程局部变量的值为空,则确定未查找到上一个异常对象。
在介绍了本申请示例性实施方式的应用于Java的调用堆栈追踪方法、和装置之后,接下来,介绍根据本申请的另一示例性实施方式的计算装置。
所属技术领域的技术人员能够理解,本申请的各个方面可以实现为系统、方法或程序产品。因此,本申请的各个方面可以具体实现为以下形式,即:完全的硬件实施方式、完全的软件实施方式(包括固件、微代码等),或硬件和软件方面结合的实施方式,这里可以统称为“电路”、“模块”或“系统”。
在一些可能的实施方式中,根据本申请的计算装置可以至少包括至少一个处理器、以及至少一个存储器。其中,存储器存储有程序代码,当程序代码被处理器执行时,使得处理器执行本说明书上述描述的根据本申请各种示例性实施方式的应用于Java的调用堆栈追踪方法中的步骤。例如,处理器可以执行如图9中所示的步骤101-103。
下面参照图9来描述根据本申请的这种实施方式的计算装置90。图9显示的计算装置90仅仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。
如图9所示,计算装置90以通用计算装置的形式表现。计算装置90的组件可以包括但不限于:上述至少一个处理器91、上述至少一个存储器92、连接不同系统组件(包括存储器92和处理器91)的总线93。
总线93表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器、外围总线、处理器或者使用多种总线结构中的任意总线结构的局域总线。
存储器92可以包括易失性存储器形式的可读介质,例如随机存取存储器(RAM)1321和/或高速缓存存储器922,还可以进一步包括只读存储器(ROM)923。
存储器92还可以包括具有一组(至少一个)程序模块924的程序/实用工具925,这样的程序模块924包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
计算装置90也可以与一个或多个外部设备94(例如键盘、指向设备等)通信,还可与一个或者多个使得用户能与计算装置90交互的设备通信,和/或与使得该计算装置90能与一个或多个其它计算装置进行通信的任何设备(例如路由器、调制解调器等)通信。这种通信可以通过输入/输出(I/O)接口95进行。并且,计算装置90还可以通过网络适配器96与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器96通过总线93与用于计算装置90的其它模块通信。应当理解,尽管图中未示出,可以结合计算装置90使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理器、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
在一些可能的实施方式中,本申请提供的应用于Java的调用堆栈追踪方法的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当程序产品在计算机设备上运行时,程序代码用于使计算机设备执行本说明书上述描述的根据本申请各种示例性实施方式的应用于Java的调用堆栈追踪方法中的步骤,例如,计算机设备可以执行如图1中所示的步骤101-103。
程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
本申请的实施方式的用于应用于Java的调用堆栈追踪管控的程序产品可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在计算装置上运行。然而,本申请的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括——但不限于——电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于——无线、有线、光缆、RF等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本申请操作的程序代码,程序设计语言包括面向对象的程序设计语言—诸如Java、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算装置上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算装置上部分在远程计算装置上执行、或者完全在远程计算装置或服务器上执行。在涉及远程计算装置的情形中,远程计算装置可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)—连接到用户计算装置,或者,可以连接到外部计算装置(例如利用因特网服务提供商来通过因特网连接)。
应当注意,尽管在上文详细描述中提及了装置的若干单元或子单元,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本申请的实施方式,上文描述的两个或更多单元的特征和功能可以在一个单元中具体化。反之,上文描述的一个单元的特征和功能可以进一步划分为由多个单元来具体化。
此外,尽管在附图中以特定顺序描述了本申请方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
Claims (11)
1.一种应用于Java的调用堆栈追踪方法,其特征在于,所述方法包括:
在调用待调用对象之前,获取调用堆栈;其中,所述调用包括跨线程调用和异步调用;
若不存在上一个调用堆栈,则生成所述待调用对象的哈希链表,该哈希链表中key为所述待调用对象的hash值,value值为node信息,所述node信息中至少包括所述待调用对象的引用以及后继node指针;
若存在上一个调用堆栈,则生成所述待调用对象的哈希链表,并将生成的哈希链表与之前生成的哈希链表进行关联。
2.根据权利要求1所述的方法,其特征在于,所述哈希链表中还包括异常对象;
所述在调用待调用对象之前,获取调用堆栈,具体包括:
基于AOP机制,在调用待调用对象之前捕获预先构造的异常对象,该异常对象中包括所述调用堆栈;
查找上一个调用堆栈,具体包括:
查找上一个异常对象;
若查找到上一个异常对象则确定查找到上一个调用堆栈;
若未查找到上一个异常对象则确定未查找到上一个调用堆栈。
3.根据权利要求2所述的方法,其特征在于,所述方法还包括:
若查找到上一个异常对象,则根据Java的异常机制将上一异常对象设置为生成的所述异常对象的cause。
4.根据权利要求3所述的方法,其特征在于,所述哈希链表中还包括抛出线程的线程ID,所述生成所述待调用对象的哈希链表之前,所述方法还包括:
确定当前线程ID与所述抛出线程ID不同。
5.根据权利要求4所述的方法,其特征在于,所述方法还包括:
在执行所述待调用对象之前,设置用于记录调用线程的第一局部变量的变量值为调用线程的线程局部变量;并,
在执行完所述待调用对象时,将所述第一局部变量置空;
根据Java的异常机制将上一异常对象设置为生成的所述异常对象的cause之前,所述方法还包括:
确定调用线程的线程局部变量为空。
6.根据权利要求1所述的方法,其特征在于,生成所述待调用对象的哈希链表,具体包括:
确定所述待调用对象的hash值,并确定所述调用堆栈的MD5值;
确定hash值和MD5值是否同时存在于之前生成的同一哈希链表中;
若是,构建一个嵌套执行所述待调用对象的新对象,并生成该新对象的哈希链表作为所述待调用对象的哈希链表;
若否,则根据确定的hash值和MD5值得到所述待调用对象的哈希链表。
7.根据权利要求1所述的方法,其特征在于,所述待调用对象的引用为弱引用。
8.根据权利要求2所述的方法,其特征在于,所述方法还包括:
声明用于存储异常对象的第二线程局部变量,其初始值为空;
执行待调用对象的方法时,将所述第二线程局部变量的值更新为调用执行的待调用对象之前对应生成的异常对象;
所述查找上一个异常对象,具体包括:
读取所述第二线程局部变量;
若所述第二线程局部变量的值不为空,则确定查找到上一个异常对象;
若所述第二线程局部变量的值为空,则确定未查找到上一个异常对象。
9.一种应用于Java的调用堆栈追踪装置,其特征在于,所述装置包括:
获取模块,用于在调用待调用对象之前,获取调用堆栈;其中,所述调用包括跨线程调用和异步调用;
生成模块,用于若不存在上一个调用堆栈,则生成所述待调用对象的哈希链表,该哈希链表中key为所述待调用对象的hash值,value值为node信息,所述node信息中至少包括所述待调用对象的引用以及后继node指针;
关联模块,用于若存在上一个调用堆栈,则生成所述待调用对象的哈希链表,并将生成的哈希链表与之前生成的哈希链表进行关联。
10.一种计算机可读介质,存储有计算机可执行指令,其特征在于,所述计算机可执行指令用于执行如权利要求1-8中任一权利要求所述的方法。
11.一种计算装置,其特征在于,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如权利要求1-8中任一权利要求所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910172580.5A CN109871290B (zh) | 2019-03-07 | 2019-03-07 | 应用于Java的调用堆栈追踪方法、装置和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910172580.5A CN109871290B (zh) | 2019-03-07 | 2019-03-07 | 应用于Java的调用堆栈追踪方法、装置和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109871290A true CN109871290A (zh) | 2019-06-11 |
CN109871290B CN109871290B (zh) | 2021-02-05 |
Family
ID=66920047
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910172580.5A Active CN109871290B (zh) | 2019-03-07 | 2019-03-07 | 应用于Java的调用堆栈追踪方法、装置和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109871290B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110618940A (zh) * | 2019-09-19 | 2019-12-27 | 腾讯科技(深圳)有限公司 | 堆栈信息追踪方法、装置、计算机可读介质及计算装置 |
CN113238915A (zh) * | 2021-05-14 | 2021-08-10 | 北京百度网讯科技有限公司 | 调用信息的处理方法、装置、设备、存储介质及程序 |
CN113282436A (zh) * | 2021-05-21 | 2021-08-20 | 北京达佳互联信息技术有限公司 | 事件处理方法、装置、设备以及存储介质 |
CN113672458A (zh) * | 2021-08-18 | 2021-11-19 | 北京基调网络股份有限公司 | 一种应用程序的监测方法、电子设备及存储介质 |
CN117033270A (zh) * | 2023-10-08 | 2023-11-10 | 腾讯科技(深圳)有限公司 | 一种芯片、设备以及数据处理方法 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20150347271A1 (en) * | 2014-05-30 | 2015-12-03 | Apple Inc. | Queue debugging using stored backtrace information |
CN105843741A (zh) * | 2016-03-24 | 2016-08-10 | 腾讯科技(深圳)有限公司 | 应用程序的信息处理方法和装置 |
CN106030456A (zh) * | 2013-10-18 | 2016-10-12 | 动力应用程序公司 | 自动异步切换标识 |
CN106933689A (zh) * | 2015-12-29 | 2017-07-07 | 伊姆西公司 | 一种用于计算设备的方法和装置 |
US20190018754A1 (en) * | 2017-07-17 | 2019-01-17 | Sap Se | Providing additional stack trace information for time-based sampling in asynchronous execution environments |
CN109284269A (zh) * | 2018-10-17 | 2019-01-29 | Oppo广东移动通信有限公司 | 异常日志分析方法、装置、存储介质及服务器 |
-
2019
- 2019-03-07 CN CN201910172580.5A patent/CN109871290B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106030456A (zh) * | 2013-10-18 | 2016-10-12 | 动力应用程序公司 | 自动异步切换标识 |
US20150347271A1 (en) * | 2014-05-30 | 2015-12-03 | Apple Inc. | Queue debugging using stored backtrace information |
CN106933689A (zh) * | 2015-12-29 | 2017-07-07 | 伊姆西公司 | 一种用于计算设备的方法和装置 |
CN105843741A (zh) * | 2016-03-24 | 2016-08-10 | 腾讯科技(深圳)有限公司 | 应用程序的信息处理方法和装置 |
US20190018754A1 (en) * | 2017-07-17 | 2019-01-17 | Sap Se | Providing additional stack trace information for time-based sampling in asynchronous execution environments |
CN109284269A (zh) * | 2018-10-17 | 2019-01-29 | Oppo广东移动通信有限公司 | 异常日志分析方法、装置、存储介质及服务器 |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110618940A (zh) * | 2019-09-19 | 2019-12-27 | 腾讯科技(深圳)有限公司 | 堆栈信息追踪方法、装置、计算机可读介质及计算装置 |
CN110618940B (zh) * | 2019-09-19 | 2024-02-06 | 腾讯科技(深圳)有限公司 | 堆栈信息追踪方法、装置、计算机可读介质及计算装置 |
CN113238915A (zh) * | 2021-05-14 | 2021-08-10 | 北京百度网讯科技有限公司 | 调用信息的处理方法、装置、设备、存储介质及程序 |
CN113282436A (zh) * | 2021-05-21 | 2021-08-20 | 北京达佳互联信息技术有限公司 | 事件处理方法、装置、设备以及存储介质 |
CN113672458A (zh) * | 2021-08-18 | 2021-11-19 | 北京基调网络股份有限公司 | 一种应用程序的监测方法、电子设备及存储介质 |
CN113672458B (zh) * | 2021-08-18 | 2022-09-09 | 北京基调网络股份有限公司 | 一种应用程序的监测方法、电子设备及存储介质 |
CN117033270A (zh) * | 2023-10-08 | 2023-11-10 | 腾讯科技(深圳)有限公司 | 一种芯片、设备以及数据处理方法 |
CN117033270B (zh) * | 2023-10-08 | 2024-01-26 | 腾讯科技(深圳)有限公司 | 一种芯片、设备以及数据处理方法 |
Also Published As
Publication number | Publication date |
---|---|
CN109871290B (zh) | 2021-02-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109871290A (zh) | 应用于Java的调用堆栈追踪方法、装置和存储介质 | |
JP5894954B2 (ja) | テストケース生成方法、テストケース生成装置およびプログラム | |
CN106201481A (zh) | 应用程序开发系统中的组件管理方法和装置 | |
US20200167159A1 (en) | Processor testing | |
CN111198868B (zh) | 一种智能分库实时数据迁移方法和装置 | |
CN105701006B (zh) | 用于程序调试中的变量跟踪的方法和系统 | |
US9110699B2 (en) | Determining optimal methods for creating virtual machines | |
CN106649084A (zh) | 函数调用信息的获取方法及装置、测试设备 | |
CN107368313B (zh) | 代码检测方法、装置及电子设备 | |
US8495629B2 (en) | Virtual machine relocation system and associated methods | |
CN103838626A (zh) | 一种处理串行任务的数据处理装置及方法 | |
US11599385B2 (en) | System and method for distribution of dependent builds across orchestration job scheduler slaves | |
WO2016183109A1 (en) | Making a prediction regarding development of a software product | |
CN104461526B (zh) | 一种终端应用程序的控件遍历方法及装置 | |
CN108460068A (zh) | 报表导入导出的方法、装置、存储介质及终端 | |
JP2023022831A (ja) | コンピュータシステム、コンピュータ実装方法、プログラム、及びコンピュータ実装システム(学習因果関係) | |
US11249880B1 (en) | Debugging and simulating application runtime execution | |
US9335987B2 (en) | Data object with common statement series | |
US10073938B2 (en) | Integrated circuit design verification | |
CN109977005B (zh) | 端到端测试方法、介质、装置和计算设备 | |
CN110362294A (zh) | 开发任务执行方法、装置、电子设备及存储介质 | |
CN110362471A (zh) | 测试用例处理方法、系统、终端及存储介质 | |
CN116341634A (zh) | 神经结构搜索模型的训练方法、装置及电子设备 | |
US9866444B2 (en) | Dynamic conversion of hardware resources of a server system | |
CN111258875A (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 |