CN112667511A - 一种通过插入代码来追踪java程序内部调用链的方法 - Google Patents
一种通过插入代码来追踪java程序内部调用链的方法 Download PDFInfo
- Publication number
- CN112667511A CN112667511A CN202011619326.4A CN202011619326A CN112667511A CN 112667511 A CN112667511 A CN 112667511A CN 202011619326 A CN202011619326 A CN 202011619326A CN 112667511 A CN112667511 A CN 112667511A
- Authority
- CN
- China
- Prior art keywords
- calling
- tangent point
- code
- call chain
- call
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 89
- 230000008859 change Effects 0.000 abstract description 4
- 238000011835 investigation Methods 0.000 abstract description 2
- 230000006870 function Effects 0.000 description 5
- 238000003780 insertion Methods 0.000 description 5
- 230000037431 insertion Effects 0.000 description 5
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012544 monitoring process Methods 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000008092 positive effect Effects 0.000 description 1
- 230000008569 process Effects 0.000 description 1
- 238000012216 screening Methods 0.000 description 1
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明属于java调用链追踪领域,涉及基于AspectJ的CTW的java调用链追踪,尤其涉及一种通过插入代码来追踪java程序内部调用链的方法;1.依次包括调用开始、业务方法1开始、业务方法1‑1开始、业务方法1‑1结束、业务方法1结束、调用结束,上述步骤中插入切点;所需代码则是使用AspectJ的CTW功能将其插入到上述切点中。本发明通过AspectJ在编译阶段对代码进行修改插入,不影响代码原有的业务逻辑,侵入性小,加载速度快,通过表达式对需要监控的调用方法进行指定,方便简明准确,生成的json文件也简洁明了地显示了方法调用的顺序、耗时以及调用前后方法参数的变化,为熟悉业务逻辑、代码性能排查、问题定位提供了极大的便利。
Description
技术领域
本发明属于java调用链追踪领域,涉及基于AspectJ的CTW的java调用链追踪,尤其涉及一种通过插入代码来追踪java程序内部调用链的方法。
背景技术
现如今java编程语言蓬勃发展,出现了大量从事java编程相关的程序员,他们日常需要熟悉业务逻辑、编写代码、调试运行、定位问题等,但是由于代码的风格、可读性和执行效率都没有统一的强制标准,这就导致了程序员在面对复杂的方法调用逻辑时,无论是在熟悉逻辑、调试运行还是定位问题方面,都将耗费较多的时间。
发明内容
本发明针对上述的java程序拥有复杂方法调用逻辑的情况下的业务逻辑熟悉难度大、调试成本高和问题定位慢等问题,提供了一种通过插入代码来追踪java程序内部调用链的方法。
为了达到上述目的,本发明采用的技术方案为,
一种通过插入代码来追踪java程序内部调用链的方法,依次包括调用开始、业务方法1开始、业务方法1-1开始、业务方法1-1结束、业务方法1结束、调用结束,
在调用开始之后和业务方法1开始之前插入切点1;
在业务方法1结束之后和调用结束之前插入切点2;
在切点1之后和业务方法1开始之前以及业务方法1开始之后和业务方法1-1开始之前插入切点3;
在业务方法1-1结束之后和业务方法1结束之前以及业务方法1结束之后和切点2之前插入切点4;
所需代码则是使用AspectJ的CTW功能将其插入到上述切点中。
作为优选,所述切点1主要用于判断是否需要记录本次调用,以便根据特定条件来记录追踪记录。
作为优选,所述切点2主要判断此次调用追踪记录是否需要生成json文件,若需要,则根据调用信息记录来生成可读json文件。
作为优选,所述切点3则是:若本次调用需要记录,则该处的代码将会获取本方法的相关参数及当前时间,并存储本次方法调用开始的信息。
作为优选,所述切点4则是:若本次调用需要记录,则该处的代码将会获取本方法的相关参数及当前时间,并存储本次方法调用结束的信息。
与现有技术相比,本发明的优点和积极效果在于,
本发明通过AspectJ在编译阶段对代码进行修改插入,不影响代码原有的业务逻辑,侵入性小,加载速度快,通过表达式对需要监控的调用方法进行指定,方便简明准确,生成的json文件也简洁明了地显示了方法调用的顺序、耗时以及调用前后方法参数的变化,为熟悉业务逻辑、代码性能排查、问题定位提供了极大的便利。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为正常业务方法调用的流程图;
图2为一种通过插入代码来追踪java程序内部调用链的方法的流程图。
具体实施方式
为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和实施例对本发明做进一步说明。需要说明的是,在不冲突的情况下,本申请的实施例及实施例中的特征可以相互组合。
在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是,本发明还可以采用不同于在此描述的其他方式来实施,因此,本发明并不限于下面公开说明书的具体实施例的限制。
实施例1,如图1、图2所示,本发明提供了一种通过插入代码来追踪java程序内部调用链的方法,主要解决当java程序拥有复杂方法调用逻辑的情况下的业务逻辑熟悉难度大、调试成本高和问题定位慢的问题。
依次包括调用开始、业务方法1开始、业务方法1-1开始、业务方法1-1结束、业务方法1结束、调用结束,
在调用开始之后和业务方法1开始之前插入切点1;
在业务方法1结束之后和调用结束之前插入切点2;
在切点1之后和业务方法1开始之前以及业务方法1开始之后和业务方法1-1开始之前插入切点3;
在业务方法1-1结束之后和业务方法1结束之前以及业务方法1结束之后和切点2之前插入切点4;
所需代码则是使用AspectJ的CTW功能将其插入到上述切点中。
通过上述的描述不难看出,首先明确需要追踪的方法范围,并通过AspectJ提供的表达式将该范围内所有的方法选中,还需要明确调用开始和调用结束的具体位置(即附图1、2中的调用开始和调用结束),并使用ApsectJ表达式选中,ApectJ的表达式为开源技术,故在此不再赘述。
接下来,需要创建4个切点即代码插入点,如附图2所示:
1)切点1位于调用开始之后,主要用于判断是否需要记录本次调用,以便根据特定条件来记录追踪记录,而不是全量记录,浪费性能和空间。
2)切点2位于调用结束之前,主要判断此次调用追踪记录是否需要生成json文件,若需要,则根据调用信息记录来生成可读json文件。
3)切点3位于每个需要追踪的方法开始执行之前,若本次调用需要记录,则该处的代码将会获取本方法的相关参数及当前时间,并存储本次方法调用开始的信息。
4)切点4位于每个需要追踪的方法执行完成之前,若本次调用需要记录,则该处的代码将会获取本方法的相关参数及当前时间,并存储本次方法调用结束的信息。
然后使用AspectJ的CTW功能将代码插入到切点中
此外,可以在任意切点处记录一些本次调用的相关信息,如请求的网址等,以便在生成更加直观地json文件地名字,也可以记录json文件里,丰富该调用信息。
整体来说,一共就如下四点:
S1,利用AspectJ的CTW功能在代码编译期间对需要监控的调用方法进行代码插入;
S2,程序运行时会按序执行相应的插入代码及传递所需的参数;
S3,在程序内部维护一个存储调用信息的列表,实时将调用信息更新到列表中;
S4,在需要结束追踪的时候,将存储的列表信息生成易读的json文件。
调用链追踪的原理和核心思想如下:
1)调用链追踪的原理:
调用链追踪的对象是方法,在java里边,每个方法都有其开始和结束,但方法内部可以再调用其它方法,如附图1中业务方法1执行期间调用了业务方法1-1,通过对每个调用地方法进行代码插入监控,也就是记录整个执行流程地顺序,从业务方法1开始、业务方法1-1开始、业务方法1-1结束再到业务方法1结束,如此下来,当我们需要获取方法调用关系时,只需要用括号匹配算法,就能生成完整的调用链。
2)调用链追踪的核心思想:
首先,调用链追踪作为非业务逻辑,需要不侵入或少侵入正常的业务逻辑,再者,调用链追踪所需要的时间成本和性能成本也要尽可能地低,因此使用了AspectJ的CTW进行代码插入,这部分的表达式匹配耗时和代码插入耗时都可以提前消耗,也就是不影响正常程序运行时完成,提高程序加载重启速度,另外,在调用开始的时候加入对调用的筛选功能,减少后续存储不必要的调用信息。
当本发明第一实施例应用于resin应用过程中,通过拦截器确定了例图2中的切点1和切点2位置,并根据需求确定了切点3和切点4,通过AspectJ表达式选中并编写插入点的代码,运行期间,各段插入的代码顺利执行发挥作用,并在调用结束前,生成了json文件,文件中包含了该次调用链的信息。
以上所述,仅是本发明的较佳实施例而已,并非是对本发明作其它形式的限制,任何熟悉本专业的技术人员可能利用上述揭示的技术内容加以变更或改型为等同变化的等效实施例应用于其它领域,但是凡是未脱离本发明技术方案内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与改型,仍属于本发明技术方案的保护范围。
Claims (5)
1.一种通过插入代码来追踪java程序内部调用链的方法,依次包括调用开始、业务方法1开始、业务方法1-1开始、业务方法1-1结束、业务方法1结束、调用结束,其特征在于,
在调用开始之后和业务方法1开始之前插入切点1;
在业务方法1结束之后和调用结束之前插入切点2;
在切点1之后和业务方法1开始之前以及业务方法1开始之后和业务方法1-1开始之前插入切点3;
在业务方法1-1结束之后和业务方法1结束之前以及业务方法1结束之后和切点2之前插入切点4;
所需代码则是使用AspectJ的CTW功能将其插入到上述切点中。
2.根据权利要求1所述的一种通过插入代码来追踪java程序内部调用链的方法,其特征在于,所述切点1主要用于判断是否需要记录本次调用,以便根据特定条件来记录追踪记录。
3.根据权利要求1所述的一种通过插入代码来追踪java程序内部调用链的方法,其特征在于,所述切点2主要判断此次调用追踪记录是否需要生成json文件,若需要,则根据调用信息记录来生成可读json文件。
4.根据权利要求2所述的一种通过插入代码来追踪java程序内部调用链的方法,其特征在于,所述切点3则是:若本次调用需要记录,则该处的代码将会获取本方法的相关参数及当前时间,并存储本次方法调用开始的信息。
5.根据权利要求3所述的一种通过插入代码来追踪java程序内部调用链的方法,其特征在于,所述切点4则是:若本次调用需要记录,则该处的代码将会获取本方法的相关参数及当前时间,并存储本次方法调用结束的信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011619326.4A CN112667511A (zh) | 2020-12-30 | 2020-12-30 | 一种通过插入代码来追踪java程序内部调用链的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011619326.4A CN112667511A (zh) | 2020-12-30 | 2020-12-30 | 一种通过插入代码来追踪java程序内部调用链的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112667511A true CN112667511A (zh) | 2021-04-16 |
Family
ID=75411602
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011619326.4A Pending CN112667511A (zh) | 2020-12-30 | 2020-12-30 | 一种通过插入代码来追踪java程序内部调用链的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112667511A (zh) |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030046667A1 (en) * | 2001-08-30 | 2003-03-06 | International Business Machines Corporation | Method and system for obtaining performance data from software compiled with or without trace hooks |
US20070220370A1 (en) * | 2006-01-12 | 2007-09-20 | International Business Machines Corporation | Mechanism to generate functional test cases for service oriented architecture (SOA) applications from errors encountered in development and runtime |
US20080256517A1 (en) * | 2006-10-18 | 2008-10-16 | International Business Machines Corporation | Method and System for Automatically Generating Unit Test Cases Which Can Reproduce Runtime Problems |
US20120054722A1 (en) * | 2010-08-30 | 2012-03-01 | Susumu Takeda | Trace generating unit, system, and program of the same |
CN104503912A (zh) * | 2014-12-24 | 2015-04-08 | 中科创达软件股份有限公司 | 一种服务响应过程的监测方法及装置 |
CN106487596A (zh) * | 2016-10-26 | 2017-03-08 | 宜人恒业科技发展(北京)有限公司 | 分布式服务跟踪实现方法 |
CN107870762A (zh) * | 2016-09-28 | 2018-04-03 | 北京京东尚科信息技术有限公司 | Soa调用链路跟踪的方法、装置及系统 |
CN108345542A (zh) * | 2018-02-28 | 2018-07-31 | 腾讯科技(深圳)有限公司 | 一种应用程序中异常处理方法及装置 |
CN109962814A (zh) * | 2019-03-29 | 2019-07-02 | 山东浪潮云信息技术有限公司 | 一种微服务开发框架的日志捕获与处理方法 |
CN110780883A (zh) * | 2018-07-30 | 2020-02-11 | 网宿科技股份有限公司 | 方法调用链跟踪方法、电子装置及计算机可读存储介质 |
CN111124906A (zh) * | 2019-12-17 | 2020-05-08 | 支付宝(杭州)信息技术有限公司 | 基于动态埋点的跟踪方法、编译方法、装置和电子设备 |
-
2020
- 2020-12-30 CN CN202011619326.4A patent/CN112667511A/zh active Pending
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030046667A1 (en) * | 2001-08-30 | 2003-03-06 | International Business Machines Corporation | Method and system for obtaining performance data from software compiled with or without trace hooks |
US20070220370A1 (en) * | 2006-01-12 | 2007-09-20 | International Business Machines Corporation | Mechanism to generate functional test cases for service oriented architecture (SOA) applications from errors encountered in development and runtime |
US20080256517A1 (en) * | 2006-10-18 | 2008-10-16 | International Business Machines Corporation | Method and System for Automatically Generating Unit Test Cases Which Can Reproduce Runtime Problems |
US20120054722A1 (en) * | 2010-08-30 | 2012-03-01 | Susumu Takeda | Trace generating unit, system, and program of the same |
CN104503912A (zh) * | 2014-12-24 | 2015-04-08 | 中科创达软件股份有限公司 | 一种服务响应过程的监测方法及装置 |
CN107870762A (zh) * | 2016-09-28 | 2018-04-03 | 北京京东尚科信息技术有限公司 | Soa调用链路跟踪的方法、装置及系统 |
CN106487596A (zh) * | 2016-10-26 | 2017-03-08 | 宜人恒业科技发展(北京)有限公司 | 分布式服务跟踪实现方法 |
CN108345542A (zh) * | 2018-02-28 | 2018-07-31 | 腾讯科技(深圳)有限公司 | 一种应用程序中异常处理方法及装置 |
CN110780883A (zh) * | 2018-07-30 | 2020-02-11 | 网宿科技股份有限公司 | 方法调用链跟踪方法、电子装置及计算机可读存储介质 |
CN109962814A (zh) * | 2019-03-29 | 2019-07-02 | 山东浪潮云信息技术有限公司 | 一种微服务开发框架的日志捕获与处理方法 |
CN111124906A (zh) * | 2019-12-17 | 2020-05-08 | 支付宝(杭州)信息技术有限公司 | 基于动态埋点的跟踪方法、编译方法、装置和电子设备 |
Non-Patent Citations (5)
Title |
---|
NULLPOINTS: "非侵入式AOP监控之——AspectJ使用", pages 1 - 19, Retrieved from the Internet <URL:https://blog.csdn.net/ccj659/article/details/53302951> * |
XUYISHENG: "看 AspectJ 在 Android 中的强势插入", pages 1 - 28, Retrieved from the Internet <URL:https://juejin.cn/post/6844903460660314120> * |
李梓萌: "Python数据分析从入门到精通", 31 March 2020, 北京:机械工业出版社, pages: 197 * |
沙木鱼: "Spring入门之AOP实践:@Aspect + @Pointcut + @Before / @Around / @After", pages 1 - 7, Retrieved from the Internet <URL:https://www.cnblogs.com/desertfish/p/11421260.html> * |
温小斌;张达;诸映晴;: "轻量级分布式追踪系统的设计与实现", 计算机时代, no. 09, 10 September 2020 (2020-09-10) * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7353427B2 (en) | Method and apparatus for breakpoint analysis of computer programming code using unexpected code path conditions | |
US9846628B2 (en) | Indicating parallel operations with user-visible events | |
US8276124B2 (en) | Constructing petri nets from traces for diagnostics | |
US20130318504A1 (en) | Execution Breakpoints in an Integrated Development Environment for Debugging Dataflow Progrrams | |
CN103049385B (zh) | 一种云环境下的php代码调试方法及系统 | |
US20130125096A1 (en) | Systems and Methods for Dynamic Collection of Probe Call Sites | |
US20180032320A1 (en) | Computer-implemented method for allowing modification of a region of original code | |
CN103077111A (zh) | 一种持续集成失败用例的定位方法及系统 | |
CN108197004B (zh) | Ios应用的方法耗时、加载视图耗时的监测方法及系统 | |
CN109597618A (zh) | 程序开发方法、装置、计算机设备及存储介质 | |
CN114860216B (zh) | 一种用于集成开发环境的c程序动态追踪方法及系统 | |
US20110029953A1 (en) | System and Method for Scalable Handling of Debug Information | |
CN110275706A (zh) | 程序发布和加载方法、装置、计算机系统及可读存储介质 | |
CN112667511A (zh) | 一种通过插入代码来追踪java程序内部调用链的方法 | |
CN115878095A (zh) | 一种基于逻辑编排的低代码开发方法、装置、设备及介质 | |
EP2820547B1 (en) | Debugging method and computer program product | |
US8484619B2 (en) | Multi-view debugging | |
CN110209593B (zh) | 一种面向偏好设置的安卓应用测试方法 | |
CN115080049A (zh) | 用于编译仿真模型的方法、系统和计算机可读存储介质 | |
Mehlitz et al. | Design for verification with dynamic assertions | |
CN112527265A (zh) | 一种日志自动注入的方法和计算机设备 | |
CN115344502B (zh) | 基于真实数据自动生成mock数据及自动加载的方法 | |
US20080126293A1 (en) | Method and apparatus for dynamically creating scenario based test designs from hierarchical use cases | |
US11934294B2 (en) | Generating and debugging bytecode for a rule | |
CN117648081B (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 |