添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
原因撒迦说了,没有生成LocalVariableTable属性。这时候jdwp能在上下文找到变量的值,可是它不认识变量的名字啊,我来做个step by step就看的很清楚了。


代码:
public class A {
	public static void foo(int a, String b, Object c) {
		System.out.println(a + b + c);
public class B {
	public static void foo(int a, String b, Object c) {
		System.out.println(a + b + c);
public class T {
	public static void main(String[] args) {
		A.foo(1, "2", new Object());
		B.foo(1, "2", new Object());
D:\Test>javac -g:lines A.java
D:\Test>javac -g B.java
      
IcyFenix 写道
原因撒迦说了,没有生成LocalVariableTable属性。这时候jdwp能在上下文找到变量的值,可是它不认识变量的名字啊,我来做个step by step就看的很清楚了。


代码:
public class A {
	public static void foo(int a, String b, Object c) {
		System.out.println(a + b + c);
public class B {
	public static void foo(int a, String b, Object c) {
		System.out.println(a + b + c);
public class T {
	public static void main(String[] args) {
		A.foo(1, "2", new Object());
		B.foo(1, "2", new Object());
D:\Test>javac -g:lines A.java
D:\Test>javac -g B.java


调试:






我感觉有问题。下面我依次写出来:
1:你开的开发开发环境是eclipse 吗?如果是的话,你先用命令行把代码编译了,然后再拷贝到eclipse里面吗?
2:如果你是按照上面的说法做的,那么我就可以得出,eclipse默认编译项目的时候都带有-g这个参数,不然我们自己调试自己的源代码的时候也会找不到LocalVariableTable而导致不能查看。
3:如果第二条我的假设成立,那么eclipse肯定有一个全局执行java命名的配置文件,那么这个文件在哪里?如何看?
4:就是你的回答还没有帮我解决的一点问题就是,为什么同一个rt.jar有些代码调试的时候有localvariableTable,而有的没有。难道sun的伙计不是全部编译的,而是一个文件一个文件编译的?再编译的时候可能忘了用-g(当然了,也有可能,因为可能早版本的java源代码不需要编译,所以就没编译,所以就没有localvariabletable,至于新版本新加的类可能有些也有localvariabletable,有些无。我想测试一下才能下结论)
5:就是谢谢你的热心回答。 Sun的JDK里,product的rt.jar是只有LineNumberTable没有LocalVariableTable的。也就是说跟不加-g或者加上-g:lines一样。

圈子的帖不能直接贴图这个我也觉得很奇怪…

xgj1988 写道
2:如果你是按照上面的说法做的,那么我就可以得出,eclipse默认编译项目的时候都带有-g这个参数,不然我们自己调试自己的源代码的时候也会找不到LocalVariableTable而导致不能查看。

对的,Eclipse默认就是会让编译器带上调试信息的。配置的位置在上面IcyFenix的截图里有了。

xgj1988 写道
3:如果第二条我的假设成立,那么eclipse肯定有一个全局执行java命名的配置文件,那么这个文件在哪里?如何看?

你做了一个错误的假设:Eclipse不是用javac来编译Java源码的,而是用它自己的编译器,名字叫ECJ。同样支持-g参数。配置的位置参考上一点。

xgj1988 写道
4:就是你的回答还没有帮我解决的一点问题就是,为什么同一个rt.jar有些代码调试的时候有localvariableTable,而有的没有。

是都没有吧…
j2se/make/common/Defs.gmk
# Any debug build should include all debug info inside the classfiles
ifeq ($(VARIANT), DBG)
  DEBUG_CLASSFILES = true
endif
ifeq ($(DEBUG_CLASSFILES),true)
  JAVACFLAGS_COMMON += -g
endif
JAVACFLAGS	   = $(JAVACFLAGS_COMMON) $(OTHER_JAVACFLAGS)
JAVAC_CMD 	   = $(JAVAC) $(JIT_OPTION) $(JAVACFLAGS) $(LANGUAGE_VERSION) $(CLASS_VERSION)

在debug build里才有-g。 你们的回答很精彩。我先一一说明一下:

1:我刚才根据LcyFenix给的图。逐步关闭上面的复选框,然后在调试确实有问题。而且如果把add line number attributes to generated class files 关闭之后,就不能下断点了(并不是不能调试,因为调试不仅仅包括下短点,个人理解根据JPDA的定义来看说的话。),所以我们的调试不会运行。

2:我把add variable attributes to generated class file 关闭之后,可以调试源代码,但是出现a can't be resolved ,注意,这里可能是我在最开始就没表述清楚,我这里说的不can't be resolved是我在eclipse里面用watch和inspect试图的时候就会can't be resolved ,但是在variables里面会显示出他的值,但是这样又有一个新问题。也就是a,b,c变量名变成了arg0,arg1,arg2这样的形式。所以可能IcyFenix也没太懂我的意思。

例子用的是IcyFenix的
public class A {   
    public static void foo(int a, String b, Object c) {   
        System.out.println(a + b + c);   
public class B {   
    public static void foo(int a, String b, Object c) {   
        System.out.println(a + b + c);   
public class T {   
    public static void main(String[] args) {   
        A.foo(1, "2", new Object());   
        B.foo(1, "2", new Object());   


所以问题就是:
1:为什么variable下面可以看到a,b,c的信息,但是在watch和inspect就不行了?

2:就是RednaxelaFX给的最后的东西不太明白是什么。哈哈

引用
j2se/make/common/Defs.gmk
Makefile代码 
# Any debug build should include all debug info inside the classfiles  
ifeq ($(VARIANT), DBG)  
  DEBUG_CLASSFILES = true  
endif  
ifeq ($(DEBUG_CLASSFILES),true)  
  JAVACFLAGS_COMMON += -g  
endif  
 
JAVACFLAGS     = $(JAVACFLAGS_COMMON) $(OTHER_JAVACFLAGS)  
JAVAC_CMD      = $(JAVAC) $(JIT_OPTION) $(JAVACFLAGS) $(LANGUAGE_VERSION) $(CLASS_VERSION)
在debug build里才有-g。