Skip to content

关于tprofiler.log无法产生日志,只有=号的问题 #60

@DevenWen

Description

@DevenWen

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions