arthas icon indicating copy to clipboard operation
arthas copied to clipboard

自动trace lambda函数

Open kylixs opened this issue 3 years ago • 3 comments

环境信息

  • Arthas 版本: 3.4.3

问题描述

Java lambda表达式在编译时被自动转换为一个函数,有几种情况:

  1. 第一层lambda方法命名规则:
  • 普通方法:lambda$<method_name>$<index>
  • 构造方法:lambda$new$<index>
  1. 嵌套的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;
    }
  1. 如果要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

  1. 如果要trace嵌套的lambda方法

没有办法准确匹配方法名,只能将所有lambda$null$的方法都trace,查看结果时根据方法调用树的根节点进行判断是否为目标方法。

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

kylixs avatar Oct 20 '20 03:10 kylixs

你这里说的“用户设置后自动匹配目标方法的lambda行数。”,是指把lambda转换后的方法行数替换成源码对应的lambda语句行数吗?

RLin2015New avatar May 14 '21 06:05 RLin2015New

你这里说的“用户设置后自动匹配目标方法的lambda行数。”,是指把lambda转换后的方法行数替换成源码对应的lambda语句行数吗?

改为:比如新增一个选项 --with-lambda ,用户设置后自动匹配目标方法包含的所有lambda函数。

kylixs avatar May 17 '21 12:05 kylixs

I would like to fix this issue.

yqxzy avatar May 23 '22 07:05 yqxzy