Open longbao8 opened 2 years ago
ignore.dup.callee.in.one.caller
参数不是用于忽略循环调用的
目前的版本中,如果需要忽略循环调用,需要按以下的方式处理
参考https://github.com/Adrninistrator/java-all-call-graph/blob/main/how_to_use.md#354-%E5%BF%BD%E7%95%A5%E7%89%B9%E5%AE%9A%E7%9A%84%E8%B0%83%E7%94%A8%E5%85%B3%E7%B3%BB
在以下配置文件中指定涉及循环调用的方法信息,可以忽略指定的方法:
_jacg_config/o_g4caller_ignore_class_keyword.properties
_jacg_config/o_g4caller_ignore_full_method_prefix.properties
_jacg_config/o_g4caller_ignore_method_prefix.properties
后续准备增加参数,专门用于忽略循环调用
ignore.dup.callee.in.one.caller
参数不是用于忽略循环调用的 目前的版本中,如果需要忽略循环调用,需要按以下的方式处理 参考https://github.com/Adrninistrator/java-all-call-graph/blob/main/how_to_use.md#354-%E5%BF%BD%E7%95%A5%E7%89%B9%E5%AE%9A%E7%9A%84%E8%B0%83%E7%94%A8%E5%85%B3%E7%B3%BB在以下配置文件中指定涉及循环调用的方法信息,可以忽略指定的方法:
_jacg_config/o_g4caller_ignore_class_keyword.properties _jacg_config/o_g4caller_ignore_full_method_prefix.properties _jacg_config/o_g4caller_ignore_method_prefix.properties
后续准备增加参数,专门用于忽略循环调用 当我忽略一些产生向下调用方法的时候,日志输出 [main] INFO com.adrninistrator.jacg.runner.RunnerGenAllGraph4Caller - 需要继续执行的任务已执行完毕 [main] ERROR com.adrninistrator.jacg.runner.base.AbstractRunner - 有任务执行失败,请检查 并且没有合并文档😫😫
ignore.dup.callee.in.one.caller
参数不是用于忽略循环调用的 目前的版本中,如果需要忽略循环调用,需要按以下的方式处理 参考https://github.com/Adrninistrator/java-all-call-graph/blob/main/how_to_use.md#354-%E5%BF%BD%E7%95%A5%E7%89%B9%E5%AE%9A%E7%9A%84%E8%B0%83%E7%94%A8%E5%85%B3%E7%B3%BB 在以下配置文件中指定涉及循环调用的方法信息,可以忽略指定的方法:_jacg_config/o_g4caller_ignore_class_keyword.properties _jacg_config/o_g4caller_ignore_full_method_prefix.properties _jacg_config/o_g4caller_ignore_method_prefix.properties
后续准备增加参数,专门用于忽略循环调用 当我忽略一些产生向下调用方法的时候,日志输出 [main] INFO com.adrninistrator.jacg.runner.RunnerGenAllGraph4Caller - 需要继续执行的任务已执行完毕 [main] ERROR com.adrninistrator.jacg.runner.base.AbstractRunner - 有任务执行失败,请检查 并且没有合并文档😫😫
再往上一些会显示错误信息,可能是有指定的方法不存在
ignore.dup.callee.in.one.caller
参数不是用于忽略循环调用的 目前的版本中,如果需要忽略循环调用,需要按以下的方式处理 参考https://github.com/Adrninistrator/java-all-call-graph/blob/main/how_to_use.md#354-%E5%BF%BD%E7%95%A5%E7%89%B9%E5%AE%9A%E7%9A%84%E8%B0%83%E7%94%A8%E5%85%B3%E7%B3%BB 在以下配置文件中指定涉及循环调用的方法信息,可以忽略指定的方法:_jacg_config/o_g4caller_ignore_class_keyword.properties _jacg_config/o_g4caller_ignore_full_method_prefix.properties _jacg_config/o_g4caller_ignore_method_prefix.properties
后续准备增加参数,专门用于忽略循环调用 当我忽略一些产生向下调用方法的时候,日志输出 [main] INFO com.adrninistrator.jacg.runner.RunnerGenAllGraph4Caller - 需要继续执行的任务已执行完毕 [main] ERROR com.adrninistrator.jacg.runner.base.AbstractRunner - 有任务执行失败,请检查 并且没有合并文档😫😫
再往上一些会显示错误信息,可能是有指定的方法不存在 我将一些方法去除,在运行的时候日志会输出所要忽略方法的类似信息: [jacg_worker-5] INFO com.adrninistrator.jacg.runner.RunnerGenAllGraph4Caller - 忽略方法名使用该前缀的入口方法 runtime_deserialize runtime_deserialize_1_int_field() [jacg_worker-5] ERROR com.adrninistrator.jacg.runner.RunnerGenAllGraph4Caller - 未找到指定的入口方法RuntimeSchemaBenchmark runtime_deserialize_1_int_field()
上面的报错说明没有找到RuntimeSchemaBenchmark
类的runtime_deserialize_1_int_field
方法往下调用其他方法的调用关系
需要检查一下这个类和方法名称正不正确,所在的jar包有没有在配置文件中指定,类和方法有没有在配置文件里指定需要忽略
o_g4caller_entry_method_ignore_prefix.properties在这个配置文件中只填写类名,o_g4caller_ignore_full_method_prefix.properties在这个配置文件中填写具体类名+方法名,运行之后打印日志中还是存在所填写的类名+方法名。如果在o_g4caller_entry_method_ignore_prefix.properties这个配置文件里一个一个填写类名加方法名对于一个项目来说感觉很麻烦😥😥
可以发一下你的具体需求,循环调用实际上是有中断处理的,如果不中断的话会生成结果文件一直执行下去不会结束
大佬,希望发现循环调用尽早结束,不要运行一晚上也没有停止。 希望o_g4caller_entry_method.properties这个文件可以配置类名,搭配o_g4caller_ignore_full_method_prefix.properties这个配置文件中填写具体类名+方法名排除不想生成的方法调用。我刚刚尝试这种搭配方式在打印日志中还是会出现想要排除的方法😫😫
是生成向上的调用链还是生成向下的调用链 向上的调用链支持忽略指定的类或者方法要等下个版本 向下的调用链支持忽略指定的类或者方法最新版本0.8.0是支持的 如果是生成向下的调用链过程中在对应的配置文件里指定了类名或者方法名还是没有忽略指定的方法调用,看能不能发一下对应的代码结构和配置的方式,看一下是哪里的问题
o_g4caller_entry_method.properties
,这个配置文件是用来忽略向下查找调用链的入口方法的,不能用来忽略查找到的被调用方法。这个文件的存在现在有点多余,有其他的方式可以替代,而已容易造成误导,下个版本考虑删掉这个配置文件
相关的循环调用代码可以麻烦发出来看一下不,可以把敏感信息替换一下,因为现在的处理在遇到循环调用时应该是能够中断的,如果存在问题需要有相关代码分析一下原因
当我在o_g4caller_ignore_full_method_prefix.properties这个配置文件中填入net.bytebuddy.benchmark.TrivialClassCreationBenchmark:benchmarkByteBuddy(),
运行之后,日志输出内容还有相关内容:
[jacg_worker-15] INFO com.adrninistrator.jacg.runner.RunnerGenAllGraph4Caller - 记录数达到 335000 net.bytebuddy.benchmark.TrivialClassCreationBenchmark:benchmarkByteBuddy()
现在还在运行...
这是一个循环的代码
[37]# [ClassReader:3612] org.objectweb.asm.Handle:
我试了一下asm 9.1版本的ClassReader类往下生成方法调用链,每个方法都很快执行完毕了 你使用的java-all-call-graph是什么版本的 指定了分析哪些jar包 指定的入口方法是什么
使用的是0.8.0版本 jar包是byte-buddy.jar o_g4caller_entry_method.properties在这里填写的是 net.bytebuddy.benchmark.ClassByExtensionBenchmark net.bytebuddy.benchmark.ClassByImplementationBenchmark net.bytebuddy.benchmark.runner.QuickRunner net.bytebuddy.benchmark.specimen.ExampleClass net.bytebuddy.benchmark.specimen.ExampleInterface net.bytebuddy.benchmark.StubInvocationBenchmark net.bytebuddy.benchmark.SuperClassInvocationBenchmark net.bytebuddy.benchmark.TrivialClassCreationBenchmark 在这个配置文件中o_g4caller_ignore_full_method_prefix.properties填的是 net.bytebuddy.benchmark.TrivialClassCreationBenchmark:benchmarkByteBuddy() 大佬,辛苦了🤐🤐
使用的是0.8.0版本 jar包是byte-buddy.jar o_g4caller_entry_method.properties在这里填写的是 net.bytebuddy.benchmark.ClassByExtensionBenchmark net.bytebuddy.benchmark.ClassByImplementationBenchmark net.bytebuddy.benchmark.runner.QuickRunner net.bytebuddy.benchmark.specimen.ExampleClass net.bytebuddy.benchmark.specimen.ExampleInterface net.bytebuddy.benchmark.StubInvocationBenchmark net.bytebuddy.benchmark.SuperClassInvocationBenchmark net.bytebuddy.benchmark.TrivialClassCreationBenchmark 在这个配置文件中o_g4caller_ignore_full_method_prefix.properties填的是 net.bytebuddy.benchmark.TrivialClassCreationBenchmark:benchmarkByteBuddy() 大佬,辛苦了🤐🤐
试了一下net.bytebuddy:byte-buddy-benchmark:1.12.19
版本的jar包,这两个方法往下处理时耗时很长:
net.bytebuddy.benchmark.TrivialClassCreationBenchmark:benchmarkByteBuddy(
net.bytebuddy.benchmark.runner.QuickRunner:main(
对于net.bytebuddy.benchmark.TrivialClassCreationBenchmark:benchmarkByteBuddy(
方法,在配置文件o_g4caller_ignore_full_method_prefix.properties
忽略以下方法后,可以比较快处理完:
net.bytebuddy.dynamic.DynamicType$Builder:make()
net.bytebuddy.ByteBuddy:subclass(java.lang.Class)
以上方法在往下处理时耗时较长,但还能处理完毕
以上方法在往下处理时会处理很久
以上net.bytebuddy.dynamic.DynamicType$Builder
接口的子类数量有70多个,所以往下处理时耗时很久
net.bytebuddy.benchmark.runner.QuickRunner:main(
方法还是能处理完的
耗时:230.502 S
结果文件大小:336 MB
为什么我已经配置0.8版本的依赖,在o_g4caller_ignore_full_method_prefix.properties配置文件中填入net.bytebuddy.benchmark.TrivialClassCreationBenchmark:benchmarkByteBuddy()之后,运行TestRunnerGenAllGraph4CallerSupportIgnore.java之后,打印日志中提到 [main] INFO com.adrninistrator.jacg.util.JACGFileUtil - 从classpath中获取文件 file:/D:/textbook/Study/Project/idea/target/test-classes/_jacg_config/o_g4caller_ignore_full_method_prefix.properties
[main] INFO com.adrninistrator.jacg.runner.RunnerGenAllGraph4Caller - 忽略指定的方法 [main] INFO com.adrninistrator.jacg.dboper.DbOperWrapper - [1] cache sql: [cn_query_simple_class] [select simple_name from class_name_benchmark where full_name = ?] [main] INFO com.adrninistrator.jacg.dboper.DbOperWrapper - [1] cache sql: [mc_query_caller_all_methods] [select distinct(caller_full_method) from method_call_benchmark where caller_class_name = ?] 为什么还是不能忽略这个方法呢?是没有用到这个配置文件还是写的格式不对??这个忽略问题困扰我好几天了🤦♂️🤦♂️
D:/textbook/Study/Project/idea/target/test-classes/_jacg_config/o_g4caller_ignore_full_method_prefix.properties
这个是使用的当前IDE编译后的资源文件吧,看一下项目里有几个_jacg_config/o_g4caller_ignore_full_method_prefix.properties
文件,是不是都是有值的
D:/textbook/Study/Project/idea/target/test-classes/_jacg_config/o_g4caller_ignore_full_method_prefix.properties 这个是使用的当前IDE编译后的资源文件吧,看一下项目里有几个
_jacg_config/o_g4caller_ignore_full_method_prefix.properties
文件,是不是都是有值的
在resource和target上都有值,就是不能进行忽略,这是怎么回事。。。
如果是在现有的配置下
在o_g4caller_entry_method.properties
中指定了net.bytebuddy.benchmark.TrivialClassCreationBenchmark
想忽略net.bytebuddy.benchmark.TrivialClassCreationBenchmark:benchmarkByteBuddy()
这个方法的话
需要在o_g4caller_entry_method_ignore_prefix.properties
配置文件中指定benchmarkByteBuddy()
后面版本会去掉o_g4caller_entry_method_ignore_prefix.properties
配置文件,改成o_g4caller_ignore_full_method_prefix.properties
等文件也支持忽略入口方法
或者按照上面的说明,这样处理:
对于net.bytebuddy.benchmark.TrivialClassCreationBenchmark:benchmarkByteBuddy(方法,在配置文件o_g4caller_ignore_full_method_prefix.properties忽略以下方法后,可以比较快处理完:
net.bytebuddy.dynamic.DynamicType$Builder:make()
net.bytebuddy.ByteBuddy:subclass(java.lang.Class)
当我在o_g4caller_entry_method_ignore_prefix.properties配置文件中指定benchmarkByteBuddy()之后,运行时打印日志信息出现
[jacg_worker-3] INFO com.adrninistrator.jacg.runner.RunnerGenAllGraph4Caller - 忽略方法名使用该前缀的入口方法 benchmarkByteBuddy() benchmarkByteBuddy() [jacg_worker-3] ERROR com.adrninistrator.jacg.runner.RunnerGenAllGraph4Caller - 未找到指定的入口方法TrivialClassCreationBenchmark benchmarkByteBuddy()
在其他方法生成完调用链之后,出现打印信息 [main] ERROR com.adrninistrator.jacg.runner.base.AbstractRunner - 有任务执行失败,请检查
[main] INFO com.adrninistrator.jacg.runner.base.AbstractRunner - 操作结束时关闭数据源 [main] INFO com.adrninistrator.jacg.dboper.DbOperator - [1] 关闭数据源 [main] INFO com.adrninistrator.jacg.runner.base.AbstractRunner - RunnerGenAllGraph4CallerSupportIgnore 执行完毕,耗时: 94.391 S 最后并没有生成_all-4caller.txt
或者按照上面的说明,这样处理:
对于net.bytebuddy.benchmark.TrivialClassCreationBenchmark:benchmarkByteBuddy(方法,在配置文件o_g4caller_ignore_full_method_prefix.properties忽略以下方法后,可以比较快处理完:
net.bytebuddy.dynamic.DynamicType$Builder:make() net.bytebuddy.ByteBuddy:subclass(java.lang.Class)
先按这个吧,现在版本忽略方法的配置分了两类,后面优化合并一下
可以试用最新版,详细文档暂未完成 版本:1.0.0
由于接口方法实现数量过多,导致生成的调用链不停止还会出现重复调用的情况。如果项目中存在大量这种接口的话,想询问一下除了添加忽略外,还可以怎么做?
中间有调用的方法: https://github.com/ReactiveX/RxJava/blob/3.x/src/main/java/io/reactivex/rxjava3/plugins/RxJavaPlugins.java https://github.com/ReactiveX/RxJava/blob/3.x/src/main/java/io/reactivex/rxjava3/functions/Function.java
上面的Function类是一个接口,项目中应该是存在很多对应的实现类,分析以上入口方法向下调用的情况时,会增加接口调用实现类对应方法的调用关系,现在的实现方式下就是这样
如果不需要接口调用实现类对应方法的调用关系,可以在下个版本增加一个参数控制这个行为
如果要忽略的话,可以在配置参数里把io.reactivex.rxjava3.functions.Function类忽略掉
作者辛苦,代码能力不强的我只能等版本😢😢
需要分析这个类么,遇到io.reactivex.rxjava3.functions.Function这种基础的接口或者父类就是这样,感觉分析这个类的意义不大
这个项目存在很多这种情况,接口太多,很难搞
我加一个配置,支持生成调用链时忽略指定的调用类型,这样可以跳过接口调用实现类的调用关系
可以用rxjava这个项目测试调用链🙃
作者辛苦,代码能力不强的我只能等版本😢😢
前天增加了忽略接口调用实现类方法调用的功能,代码写了,等周末和其他修改的功能一起提交 现在要忽略的话,可以在写入数据库以后,生成方法调用链之前在数据库执行下面的sql语句,效果是一样的:
update jacg_method_call_xxx set enabled=0 where call_type='_ITF';
根据您的推荐以及查看调用链,使用以下两条语句使得接口实现类多,而导致停不下来的问题得到解决,该文https://github.com/Adrninistrator/java-all-call-graph/blob/main/other_instructions.md 也有提及类似操作。
update jacg_method_call_benchmark set enabled=0 where call_type='_ITF';
update jacg_method_call_benchmark set enabled=0 where call_type='_SCC';
根据您的推荐以及查看调用链,使用以下两条语句使得接口实现类多,而导致停不下来的问题得到解决,该文https://github.com/Adrninistrator/java-all-call-graph/blob/main/other_instructions.md 也有提及类似操作。
update jacg_method_call_benchmark set enabled=0 where call_type='_ITF'; update jacg_method_call_benchmark set enabled=0 where call_type='_SCC';
增加了生成方法调用链时忽略指定的调用类型的功能,在下面的配置文件中指定就可以了,不再需要更新数据库method_call表:
ignore.dup.callee.in.one.caller=true ,将该配置设置为true并不能忽略循环调用,打印日志里可以找到循环调用,以及记录数达到数目😫😫