Eclipse断点设置引发的血案...

原创文章,转载请注明出处:http://blog.csdn.net/wind5shy/article/details/6546303

今天在调试代码时遇到了因为断点设置而被误导,错误判断抛出异常的代码位置的情况,非常有迷惑性,一度百思不得其解,差点就让帅哥我拿豆腐撞死了!O(∩_∩)O~具体如下:

 

if (req == ptr_t.NULL) {
   req = lock_head_t.find_lock_request(lock, the_xlinfo);
   if (l.isDebugEnabled()) {
    if (req != ptr_t.NULL) {
     SM.DBGTHRD(" request=" + lock_request_t.toString(req));
    } else {
     SM.DBGTHRD(" STILL NO REQUEST");
    }
   }
  }

  /** do the task */
  boolean success = false;
  boolean has_waiter = false;
  while (true) {

   /**
    * See if this is a conversion request
    */
   if (req != ptr_t.NULL) {

在开始的if和后面的while处设置了断点,F8运行,在进入whlie断点前,报如下错误:
java.lang.Error
 at com.hw.ogsa.util.Ensure.isLegal(Ensure.java:37)
 at com.hw.tartarus.os.core.KERNEL.undefine(KERNEL.java:361)
 at com.hw.tartarus.sm.store.test_create_file.main_run(test_create_file.java:66)
 at com.hw.tartarus.os.core.sthread_t.run(sthread_t.java:1134)
 at java.lang.Thread.run(Unknown Source)
com.hw.tartarus.os.error.StoreException: E_INTRANSin active transaction (not allowed for this operation)
 at com.hw.tartarus.sm.core.smthread_t.join(smthread_t.java:352)
 at com.hw.tartarus.sm.store.test_create_file.main(test_create_file.java:84)
 
根据一般经验,觉得应该是do the task之前代码有问题,于是F6单步调试,又没有问题!
于是怀疑是代码中可能涉及了锁操作,而且应该和线程相关(因为第二个异常的信息).
仔细研究了第二个异常的信息,发现这是主线程在测试线程异常结束后进行相应的处理时抛出的异常,也就是说和代码的异常和线程没有什么关系.
再仔细研究了代码,代码涉及锁的只有一处,而且F8可以运行过,这么看来锁也没有问题.
于是再F6,还是没有问题...F8,还是报错...囧
再一次F6时运行过while时突然发现光标在whlie这行代码似乎直接跳过去了,于是在while前后的代码分别下了断点,F8,果然,while处的断点直接就跳过去了,也就是说报错的代码不在while前,而是在whlie后!杯具!
仔细研究了下,if(true),for(;;)这些语句也是一样的情况,不过如果是循环(for,while),第一次是直接跳过,但以后就会进入语句;而do{}while(true)则每次都会进入.估计这个可能是jvm做的优化造成的.

原创文章,转载请注明出处:http://blog.csdn.net/wind5shy/article/details/6546303


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值