[讨论] JVM变量的变量调试问题。

xgj1988 2011-04-26
刚才在和 RednaxelaFX , IcyFenix  讨论的帖子中设计到调试问题
http://hllvm.group.iteye.com/group/topic/25798

于是我就在自己机子上面捣腾,搞了半天发现另外个问题。

是这样的,我们知道eclipse可以调试变量,方法就是在变量前面加断点,然后我们右键断点 在弹出的菜单中,选择breakpoint properties ,然后在Hit Count 设置 成10 。也就是运行多少次停止(被使用多少次断点就停止)。

public class Test {
	private static int fn_count = 0;

	public static void main(String[] args) {
		for (int i = 1; i <= 10; i++) {
			System.out.println(i);
			fn_count = i;
			//    System.out.println(fn_count);
			//			fn();
		}
	}

	public static void fn() {
		fn_count = fn_count + 1;
		System.out.println(fn_count);
	}
}


本来我的想法是,应该在 i=9的时候就要停止,因为初始化的时候1次,然后循环9次后就应该停止了。因为这个时候fn_count 正好被执行第10次,满足hit count 10 ,所以应该停止,但是 如果是执行  fn_count = i; 9次,那么和我想法一样, 但如果执行 System.out.println(fn_count ); 则在i=10的时候才停止断点,也就是hit count 11次的时候,因为初始化一次。我测fn方法也是第一种情况。对于第二种情况为什么会这样在hit 11次的时候才断下来实在不懂。

下面是图,大家看看
william_ai 2011-04-26
能不能把watchpoints的properties贴出来,估计是Modification和Access全开了。
赋值即putstatic看做是一次Modification。这个和你的理解是一致的,就是那个初始化的时候做了一次putstatic,然后main里面执行了9次得putstatic。
而getstatic看做是一次Access,所以就有10次了。

场景一:fn_count=i;
这个时候满足条件Modification
场景二:System.out.println(fn_count);
这个时候满足条件Access

PS:在Modification和Access全开的场景下,其实这个hit count是各算各的,就是Modification和Access分别有自己的hit count。其中一个的hit count达到阀值10时,触发 suspend。而不是Modification's hit count + Access hit count == 10时触发suspend。
xgj1988 2011-04-27
额。。谢谢。。果然全开了。哈哈
Global site tag (gtag.js) - Google Analytics