WALA如何对存在依赖关联的多个jar包执行程序切片操作
WALA多依赖Jar程序切片解决方案
方法1:同时加载多个Jar包执行切片
- 构造分析域(AnalysisScope)时,直接将所有关联Jar包全部加入即可,无需单独拆分单个HDFS Jar。WALA的
AnalysisScopeReader类本身支持多Jar路径输入,你可以把HDFS jar、hadoop-common以及其他所有依赖的Hadoop组件jar的路径全部放入路径列表后统一加载。 - 核心实现逻辑参考:
// 收集所有需要加载的jar路径 List<File> dependencyJars = Arrays.asList( new File("/path/to/hdfs.jar"), new File("/path/to/hadoop-common.jar"), // 其余依赖jar依次添加 ); AnalysisScope scope = AnalysisScopeReader.makeJavaBinaryAnalysisScope( dependencyJars.stream().map(File::getAbsolutePath).toArray(String[]::new), null // 可按需传入额外的exclude配置 );
- 该模式下WALA的调用图构建会自动覆盖所有加载Jar内的代码逻辑,切片时会追溯到依赖Jar内的实现,不会只停留在HDFS Jar的方法调用边界。
方法2:单Jar切片时保留依赖调用逻辑
如果不需要分析依赖Jar的内部实现,只需要切片结果保留依赖调用的关联关系,可以调整调用图构造策略:
- 开启跨过程分析的边界扩展配置,设置
CFABuilder的handleStaticFields和handleCallGraphEdges参数为全量模式,不要设置为仅分析应用代码。 - 不要在AnalysisScope中排除依赖类,即不要配置
ExclusionClasses列表过滤hadoop包下的类,否则WALA会将依赖方法视为外部黑箱,切片时不会保留这些调用的关联关系。 - 如果仅需要对依赖内的特定方法做切片追溯,可以单独将这些方法所在的类加入分析域,不需要全量加载所有依赖Jar,能大幅降低分析的内存开销。
注意事项
- 入门阶段建议先全量加载所有相关Hadoop Jar包执行切片,先排除配置问题导致的切片结果不全,等熟悉配置逻辑后再按需裁剪加载范围。
- 切片准则(SliceCriterion)定义时建议包含完整的方法签名,避免不同Jar内同名方法导致的匹配错误。
内容的提问来源于stack exchange,提问作者zhouyn
相关产品推荐
相关产品推荐

