如何在Java堆栈跟踪中阅读此行?

4

由于涉及Lambda表达式,堆栈变得复杂(注意由于混淆而丢失了行号)。"access$lambda$12"实际上是什么意思?在不知道实际行号的情况下,有没有一种方法可以定位到代码中的此处?

at com.group.RKGroup.com.my.MyClass access$lambda$12(com.group.RKGroup,int,com.my.PType) (RKGroup.java:43324)

行号无用,因为此堆栈跟踪已使用Proguard进行了混淆。

2
这表示在您的access方法中声明了一个lambda。可能是该方法中的第12个...虽然我不能保证。 - Stephen C
这是第12个匿名类。 - phflack
可能是类文件名中的$1是什么?的重复。 - phflack
@Eran:行号是无用的,因为这个堆栈跟踪被Proguard混淆了。 - user1615898
始终有可能为lambda的调用者提供帮助(下一行)。这个源代码真的没有43324行,我祈祷吧? - Joop Eggen
2个回答

3
在正常情况下,这表示在名为access的方法中声明了一个lambda表达式。可能是该方法中的第12个lambda表达式...虽然我不能确定。

请注意,由于混淆,行号丢失了。

好的,这解释了你如何得到void[错字]作为类名。但这也意味着方法名也可能是伪造的。
你唯一能确定这行代码指的是什么的方法是尝试反向工程字节码。
此时,我建议您将堆栈跟踪发送给该软件的供应商,并让他们帮助您。如果他们无法或不愿意帮忙,请要求获取源代码。如果他们无法或不愿意向您提供访问权限,请寻找新产品。调试别人混淆的代码是一场噩梦。

1
这看起来像是一个方法内的lambda,但是...

javac不会生成这样的名称(接近但不是这个)。即使没有指定,javac也会将它们生成为
lambda$<method-name-where-used>$<incremental-number>

如果您有类似以下的内容:
List<Integer> r = Stream.of(1).map(x -> x).collect(Collectors.toList());
lambda$new$<incremental-number> 

注意,在您的情况下,方法名(access)首先出现,因此这看起来非常像androidretro-lambda。如果我没记错,他们会生成像这样的代码,再次未指定,但它真正意味着的是在您的access方法中有一个lambda表达式,特别是该方法中的第12个lambda。同样,如果我没记错,retro-lambda使用相同的逐步命名方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接