Adrninistrator / java-callgraph2

Programs for producing static call graphs for Java programs.
Apache License 2.0
184 stars 66 forks source link

是否有支持判断A函数调用B函数(非直接调用)的接口 #15

Open ZupeiNie opened 1 year ago

ZupeiNie commented 1 year ago

你好,请问该项目是否有支持判断A函数调用B函数(非直接调用)的接口

Adrninistrator commented 1 year ago

https://github.com/Adrninistrator/java-all-call-graph/blob/main/java-all-call-graph/src/main/java/com/adrninistrator/jacg/extractor/entry/CallerGraphBaseExtractor.java 使用这个类的baseExtract()方法 先生成A函数向下的方法完整调用链 再根据B函数查找A函数间接调用B函数的调用堆栈(需要把B函数配置在_jacg_find_stack_keyword/find_stack_keyword_4er.properties文件中) 最后获取对应的调用堆栈文件及相关信息

对类的设置可以参考https://github.com/Adrninistrator/java-all-call-graph/blob/main/java-all-call-graph/src/test/java/test/run_by_code/base/TestRunByCodeBase.java,和配置文件的参数是对应的

文档现在还没时间整理

Adrninistrator commented 1 year ago

上面是从上往下查找的方式,从下往上查找也可以: https://github.com/Adrninistrator/java-all-call-graph/blob/main/java-all-call-graph/src/main/java/com/adrninistrator/jacg/extractor/entry/CalleeGraphEntryExtractor.java 使用这个类的extract()方法 先生成B函数向上的方法完整调用链 再根据A函数查找B函数间接被A函数调用的调用堆栈(需要把A函数配置在_jacg_find_stack_keyword/find_stack_keyword_4ee.properties文件中) 最后获取对应的调用堆栈文件及相关信息

如果有需要的话我可以提交一个示例代码

ZupeiNie commented 1 year ago

那麻烦上传一份示例代码,十分感谢

Adrninistrator commented 1 year ago

判断指定的两个方法之间是否存在调用关系(直接或间接的),从被调用方法开始向上查找

使用https://github.com/Adrninistrator/java-all-call-graph项目:

执行gradlew test_jar命令

生成示例代码的jar包

执行test.run_by_code.TestRBC0RunnerWriteDb

解析示例代码jar包,并写入数据库

通过com.adrninistrator.jacg.extractor.entry.CalleeGraphBaseExtractor:baseExtract()方法,判断指定的两个方法之间是否存在调用关系(直接或间接的)

OtherConfigFileUseSetEnum.OCFUSE_METHOD_CLASS_4CALLEE参数中指定被调用方法

OtherConfigFileUseListEnum.OCFULE_FIND_STACK_KEYWORD_4EE参数中指定调用方法

为了判断test.call_graph.annotation.CallMethodWithAnnotation:test1()是否有直接或间接调用test.call_graph.annotation.MethodWithAnnotation:test1()方法

可执行test.run_by_code.extractor.TestMethodCallRelationshipByEE

若有调用,则以上baseExtract()方法返回的list非空,示例略,在_jacg_o_ee目录中会生成对应的方法调用堆栈文件

建议使用这种方式,从被调用方法开始向上查找,需要处理的方法调用比较少

Adrninistrator commented 1 year ago

判断指定的两个方法之间是否存在调用关系(直接或间接的),从调用方法开始向下查找

同上,只需要执行一次

同上,只需要执行一次

通过com.adrninistrator.jacg.extractor.entry.CallerGraphBaseExtractor:baseExtract()方法,判断指定的两个方法之间是否存在调用关系(直接或间接的)

OtherConfigFileUseSetEnum.OCFUSE_METHOD_CLASS_4CALLER参数中指定调用方法

OtherConfigFileUseListEnum.OCFULE_FIND_STACK_KEYWORD_4ER参数中指定被调用方法

为了判断test.call_graph.annotation.CallMethodWithAnnotation:test1()是否有直接或间接调用test.call_graph.annotation.MethodWithAnnotation:test1()方法

可执行test.run_by_code.extractor.TestMethodCallRelationshipByER

若有调用,则以上baseExtract()方法返回的list非空,示例略,在_jacg_o_er目录中会生成对应的方法调用堆栈文件

ZupeiNie commented 1 year ago

我现在是没使用java-all-call-graph这个工具,还只是用java-callgraph2这个工具,得到了调用关系,想通过这里单条的调用数据生成调用链,不知道你是怎么实现获得调用链的

Adrninistrator commented 1 year ago

java-all-call-graph是用来生成调用链的,把调用关系写到数据库之后再读取出来,用来生成调用链