arthas
arthas copied to clipboard
自动trace lambda函数
环境信息
- Arthas 版本: 3.4.3
问题描述
Java lambda表达式在编译时被自动转换为一个函数,有几种情况:
- 第一层lambda方法命名规则:
- 普通方法:
lambda$<method_name>$<index> - 构造方法:
lambda$new$<index>
- 嵌套的lambda方法(即在lambda里面写lambda)
lambda$null$<index>
如何Trace lambda方法
测试的代码如下:
public List<Integer> primeFactors(int number) {
...
List<Integer> result = new ArrayList<Integer>();
...
result.forEach(n -> {
System.out.println("result: " + n);
foo();
map.forEach((k,v) -> {
System.out.println("key: "+k);
foo();
});
});
return result;
}
- 如果要trace第一层lambda方法,可以使用下面的命令:
trace -E class_name method_name|lambda\\$method_name\\$.*
输出结果:
`---ts=2021-01-27 11:47:57;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@55f96302
`---[2.694663ms] demo.MathGame:primeFactors()
`---[min=0.44355ms,max=0.73601ms,total=2.121468ms,count=4] demo.MathGame:lambda$primeFactors$3()
`---[min=0.077582ms,max=0.167717ms,total=0.414161ms,count=4] demo.MathGame:foo() #92
- 如果要trace嵌套的lambda方法
没有办法准确匹配方法名,只能将所有lambda$null$
trace -E class_name method_name|lambda\\$method_name\\$.*|lambda\\$null\\$.*
输出结果:
`---ts=2021-01-27 11:48:26;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@55f96302
`---[3.332729ms] demo.MathGame:primeFactors()
`---[0.263834ms] demo.MathGame:lambda$primeFactors$3()
+---[0.013397ms] demo.MathGame:foo() #92
`---[0.06106ms] demo.MathGame:lambda$null$2()
`---[0.009974ms] demo.MathGame:foo() #95
期望
trace 时是否可以自动匹配这种方法,简化用户操作。
比如新增一个选项 --with-lambda ,用户设置后自动匹配目标方法包含的所有lambda函数。
查看lambda方法名的命令:
javap -p /path/xxx.class
你这里说的“用户设置后自动匹配目标方法的lambda行数。”,是指把lambda转换后的方法行数替换成源码对应的lambda语句行数吗?
你这里说的“用户设置后自动匹配目标方法的lambda行数。”,是指把lambda转换后的方法行数替换成源码对应的lambda语句行数吗?
改为:比如新增一个选项 --with-lambda ,用户设置后自动匹配目标方法包含的所有lambda函数。
I would like to fix this issue.