
[Soot学习笔记][7]Soot Instrument教程学习(More on profiling)
发布日期:2021-05-14 17:10:20
浏览次数:31
分类:精选文章
本文共 1142 字,大约阅读时间需要 3 分钟。
为了实现对TestInvoke类中静态方法调用的计数,本次实验采用了Soot工具的Instrumentation功能,将相关代码插入到Soot分析阶段中。以下是完整的实现过程:
实验目标:
在TestInvoke.java的bar()
函数调用的每一次调用位置,插入计数器更新逻辑。最终统计和输出bar()
被调用的次数。
实验步骤解析:
准备MyCounter类
首先,编写一个简单的计数器类MyCounter.java。该类包含一个静态变量c
,以及两个同步方法increase(int howmany)
和report()
。increase
方法用于根据传入参数递增计数器,report
方法负责输出当前计数器值。 编写MainDriver.java
创建MainDriver.java文件,为Soot配置分析环境。在main方法中,加载所需的TestInvoke类,并在默认的类包中添加一个变换阶段。该阶段使用InvokeStaticInstrumenter
来处理所有静态方法调用,特别是MyCounter
类的相关方法。 实现Instrumenter类
定义InvokeStaticInstrumenter
类继承自Soot的BodyTransformer
,内置internalTransform
方法。该方法遍历该方法的语句单元,检测静态方法调用(如StaticInvokeExpr
),并在每次调用前插入计数器更新语句。同时,在main
方法的返回语句处插入计数器的静态报表生成逻辑。 配置Soot工具
将MyCounter.java和MainDriver.java文件复制到与TestInvoke.java同一目录下,以便Soot充分编译和准备环境。运行测试
在命令行运行MainDriver类,并传递TestInvoke作为参数。设定参数选项,确保所有必要的类已描述。通过 Observelle 日志查看输出结果。验证实验结果
执行后,观察输出结果是否正确反映bar()
被调用的次数。检查是否有计数器未正确调用,或者是否存在性能问题。 注意事项:
- 静态方法调用的处理:确保仅处理静态方法调用,避免处理非静态或非目标方法。
- 线程安全:
MyCounter
类中的计数器操作需要同步处理,避免多线程情况下的竞态状态。 - 代码插入的位置:确保插入的计数器更新语句不会干扰原有逻辑,可能需要对控制流进行适当的调整。
总结
通过以上步骤,能够有效地在Soot工具的分析阶段插入调试代码,从而统计和显示TestInvoke类中静态方法bar()
的调用次数。这不仅实现了实验目标,还为后续代码分析和优化提供了可靠的基础。虽然过程略显复杂,但通过细致的步骤和对Soot工具生态的理解,本次实验能够顺利完成。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月30日 11时29分49秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
突破Bias-Variance困境
2019-03-12
函数可导和可微的区别: 一元中互为充要;多元中可微是可导的必要条件,可导不一定可微。
2019-03-12
一文说尽C++赋值运算符重载函数(operator=)
2019-03-12
Form窗体属性
2019-03-12
Nintendo - NES Emulators 网站
2019-03-12
android market 开发者注册
2019-03-12
1024程序员节
2019-03-12
删除文件提示“您需要权限才能执行此操作”如何解决
2019-03-12
IC封装图片大全
2019-03-12
自恢复保险丝的选用
2019-03-12
开关电源 误差放大器电路
2019-03-12
Altium Designer唤出关掉的窗口
2019-03-12
输入过欠压保护电路原理图
2019-03-12
altium designer PCB 屏蔽DRC报错
2019-03-12
J-link v8固件修复
2019-03-12
Windows7自动安装驱动功能关闭与开启教程
2019-03-12
MDK编译后生成bin文件占用FLASH大小说明
2019-03-12
六大原则
2019-03-12