-
Notifications
You must be signed in to change notification settings - Fork 913
Open
Description
hi,各位。
我这边分析了一下TProfiler的代码,定位了这一个bug,并做了简单的修复。这里和大家分享一下,希望对大家有所帮助。
内部的bug主要在于ProfFilter类及其子类MysqlProfFilter上。
ProfFilter.includePackage字段是用于判断是否需要注入代码的。
public static boolean isNeedInject(String className) {
String icaseName = className.toLowerCase().replace('.', '/');
for (String v : includePackage) {
if (icaseName.startsWith(v)) {
return true;
}
}
return false;
}MysqlProfFilter的构造方法会把mysql的包信息也自动写进去到ProfFilter.includePackage去。
在ProfTransformer.transform中,79行处表示“如果可以注入mysql成功;则不再继续注入”,所以问题在于transform4Mysql方法,45行处,
if(!MysqlProfFilter.getInstance().isNeedInject(className))
这个方法虽然获取了Instance,但是调用的是父类的静态方法,也就是说,我们配置的package都会被视为mysql的类,进而使用mysql的统计方式,而无法把日志写到tprofiler.log上
修复方法:
为MysqlProfFilter定义一个新的静态方法,那个方法只需检查mysql的package。
if(!MysqlProfFilter.isNeedInjectMysql(className))
暂时不清楚作者对这个设置是什么原因,我自己对这个逻辑做了修改,验证过tprofiler.log是可以获得日志,进而按照wiki的方法去做性能分析。
希望这些可以帮助到各位需要使用这个工具的朋友,有问题可以在这个issue下补充留言。
Metadata
Metadata
Assignees
Labels
No labels