【问题标题】:Eclipse debugger "jumps" skipping important codeEclipse 调试器“跳转”跳过重要代码
【发布时间】:2012-01-30 00:35:02
【问题描述】:

我在调试 android 应用程序时遇到了一个奇怪的问题。 准确地说,我在这里复制了我正在运行的确切代码:

    // Get the puzzles from cache
List<PuzzleDetails> newPuzzles = m_cachedPuzzles.getPuzzles(count);

if(newPuzzles.size() > 0){
    // Remove from cache
    m_cachedPuzzles.removePuzzles(newPuzzles);  // LINE (A)     

    // Add the new puzzles from cache immediately
    m_ownedPuzzles.addPuzzles(newPuzzles);

    Log.d("requests", "" + newPuzzles.size() + " moved from cache to user");
}

int left = count - newPuzzles.size();       
String deviceId = ResourcesPublisher.getInstance().getDeviceId();

// Don't let anyone else use these points for now
ChallengePointsManagerImpl.getInstance().usePoints(left);       

Log.d("requests", "aquirePuzzles(" + left + ")");

// Get a list of requests for 'left' number of puzzles
RequestList reqList = getRequestList(left);

// TODO this is a bug, now
if(reqList.size() > 1){
    reqList = getRequestList(left);  // LINE (B)
}

当我在这段代码上运行时,在跨过线 (A) 之后 m_cachedPuzzles.removePuzzles(newPuzzles); 调试器“跳转”到最后一行 (B) reqList = getRequestList(left);

一个简单的检查表明它确实跳过了这些代码行之间的所有代码。 例如,Log.d(...) 从未被调用或写入。

谁能告诉我为什么会这样???

谢谢!

【问题讨论】:

  • 如果它从未被调用,那么很可能源代码和可执行文件“不同步”。尝试进行清理、重建和重新启动。
  • 我尝试过清洁,但它仍然会发生.. 这真的很奇怪 - 每次都会发生,所以我觉得更有义务检查和修复它。我只是不知道从哪里开始......
  • 你关闭模拟器后重启了吗?
  • 是的,我刚刚关闭了模拟器和 Eclipse,然后重新启动了它们。没有帮助我...
  • 嗯。如果您只复制源代码并创建一个新项目怎么办?我仍然认为这是一个构建/部署问题,尽管我不确定还有什么要检查的。

标签: java android eclipse debugging


【解决方案1】:

在编译代码之后开始调试之前,尝试在 Project Explorer 上显示的项目上单击右键 > refresh

【讨论】:

    【解决方案2】:

    也许A行抛出了异常,下一步对应的就是关闭这个栈帧?

    【讨论】:

    • 我不确定我是否完全理解这个解释。尽管如此,我还是尝试将行 (A) 包含在一个 try-catch 语句中,该语句捕获所有 Throwable。然后我尝试再次调试,调试器仍然从(A)行“跳转”到(B)行......
    • 我的想法(尽管它似乎不是真的)是有时运行时异常会导致明显令人惊讶的调试指令指针运动,并且调试器通常会显示程序位于最后一行一个函数,因为它从异常中退出。
    【解决方案3】:
            mIsReaded = (mIsReaded)?false:true;
            //mIsReaded = !mIsReaded;
            saveReadFlag();
            refreshUI();
            Toast.makeText(getSherlockActivity(),... 
    

    在我的情况下,注释代码行会导致类似的问题(跳过两行)。为了解决它,我只是通过上面发布的代码行更改了这一行(我的意思是 mIsReaded = (mIsReaded)?false:true;)所以不同的情况有不同的解决方案。这是编译器优化代码的结果,所以请在(内部)重构一些东西 m_cachedPuzzles.removePuzzles(newPuzzles);

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题。问题是,您可能正在调试 IDE 中的代码,而不是服务器上的代码。您必须从服务器上的 IDE(Eclypse、Netbeans 等)部署代码。它对我有用!祝你好运!

      【讨论】:

        【解决方案5】:

        与 Eclipse 没有直接关系,但我在使用 Xamarin Extension for Visual Studio 时遇到了类似的问题,我的认识可能会有所帮助。我正在开发一个带有类库的应用程序。当我对库进行更改然后开始模拟我的应用程序时,DLL 不会总是重新构建,因此调试器会像我最新更改之前一样逐步遍历 PDB。重建DLL后,它会顺利通过。

        简而言之,如果进行了任何更改,请重建依赖项。

        希望您能解决您的问题。祝你好运

        【讨论】:

          【解决方案6】:

          使用多行注释来注释 TODO

          /*// TODO this is a bug, now*/
          

          然后再试一次。

          【讨论】:

          • 这如何回答他的问题?
          • 我真的不知道,直到现在都无法想象!但我有同样的问题,只是用多行评论评论了评论的 TODO 并且工作
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-05
          • 1970-01-01
          • 2010-12-13
          相关资源
          最近更新 更多