为什么从JDK调试类文件时Eclipse不显示本地变量值?

23

我想要调试.class文件,例如一些来自JDK的文件。我已经下载了源码并进行了附加。

public File[] listFiles(FilenameFilter paramFilenameFilter)
{
   String[] arrayOfString = list(); // now we here
   if (arrayOfString == null) return null;
   ....
}
然后我输入F6并移动到下一行。之后,我尝试查看arrayOfString的值,但看到如下情况:
表达式视图:


这是正常情况吗?有没有一种调试方式?
更新1:
enter image description here

更新2:
enter image description here
更新3:
enter image description here
7个回答

24
问题在于JDK的源代码/类文件编译时没有包含调试信息,因此Eclipse无法检查这些变量。有关更多信息,请参见此答案
要解决问题,您需要获取一个不同的rt.jar文件,或者自行编译

0

当这种情况开始发生在我身上时,一些解决方案并没有解决问题,而且我开始遇到的问题也不止这一个。

我想提出另一个解决方案(包括自己)。尽可能将你的工作区迁移到Android Studio,并开始熟悉新的IDE。如果是为公司开发,请尝试安排时间来迁移这些工作区,因为有些很容易,而有些带有NDK组件的则可能不太容易。

但是,随着Eclipse停止支持和Google对Android Studio的关注,我们最好(仅代表我的意见)开始学习新环境。现在它已经达到了一个相当稳定的点,超过了Eclipse上的常规Android应用程序开发方面。


0
你可以在“变量”窗口中查看所有变量的值。只有当表达式具有作用域时,它们才会显示值,但有时它们的行为并不符合我们的预期。
所以我的建议是你应该使用“变量”窗口来查看所有变量及其值。

我在变量中没有看到这个变量。 - gstackoverflow
据我所知,该变量不会显示局部变量,只会显示类变量/字段。 - mal

0

我建议在所选表达式上使用ctrl+shift+i,以进行检查。

另一个选择是将Display视图添加到您的环境中,您可以在其中键入自己的表达式,并像放置在代码中一样进行检查。


我尝试了,但它没有帮助。 - gstackoverflow
list()方法是做什么的?我想到的是,你的源代码与编译后的类不同,即在第1090行存在差异,或者变量名称不同。 - xwhyz

0
在“表达式”视图中,您可以输入任何表达式,Eclipse 将尝试在当前执行上下文中对其进行评估。这意味着如果您的表达式在当前上下文中无效(例如,您尝试评估 object.myMethod() 但 object 为 null),则会出现您所显示的错误。

实际上,您可以看到该表达式没有被计算。 - gstackoverflow

-1

是的,你可以使用菜单中的inspect选项(在观察下方)通过鼠标光标选择表达式。确保你已经正确地选择了整个表达式。

例如,如果以下是代码:

if(object.value())
{
// some code
}

所以只选择 object.value() 并右键点击选择 inspect

另一个选项是在可用的 variable 选项卡中查看变量值


相同的结果,但在另一个位置。 - gstackoverflow
只需用鼠标选择 'arrayOfString' 变量,右键单击并查看。如果您想评估 'arrayOfString == null' 是否为空,则选择该表达式并查看检查。 - Bhushan Kawadkar
您正在选择整个if块,请选择“arrayOfString == null”并说出检查。这将向您显示true或false值。根据情况,您可以假定它是否进入if块。 - Bhushan Kawadkar
你能否把整个类发布出来,如果不是太长的话? - Alexis Dufrenoy

-1
从 Eclipse 菜单栏中选择 Windows -> Preferences -> Java -> Complier,检查“向生成的类文件添加变量属性(由调试器使用)”复选框已被选中。

OP没有说明他们是否在Eclipse中自己编译了JDK源代码,我认为假设他们这样做是没有意义的。 - Dan Getz

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