Android Studio 调试器突出显示错误的行
Posted
技术标签:
【中文标题】Android Studio 调试器突出显示错误的行【英文标题】:Android Studio debugger highlights the wrong lines 【发布时间】:2014-03-15 09:05:35 【问题描述】:就执行的内容而言,我看不出任何功能上的错误,但我只是浪费了一个小时来证明我的代码和编译器正在做他们应该做的事情。
考虑这段代码:
public int getAnswer(int a)
int retval = 18;
int x = 25;
int y = 50;
while (a-- > 0)
if (a == 3)
retval = a;
return retval;
x = 10;
y = 20;
return 0;
调用
int theAnswer = getAnswer(6);
在包含return
的两行都断点,在运行代码之前,尝试预测结果,从而预测哪一行会被命中。
正如您可能从我的问题的语气中想象的那样,错误的行被突出显示,但返回了正确的结果。如果您单步执行代码,它会跳来跳去。
有什么可以不同的配置来显示正确的行吗? (我正在使用最新的 android Studio,我很欣赏它可能不稳定,但我确信我在 Eclipse 上看到过类似的行为,但我从来没有花时间去追踪它;也许这是一个 java 的事情) .
【问题讨论】:
【参考方案1】:这是 dx 的一个问题,它是构建的一部分,它将您的 Java .class 文件转换为 .dx 文件以打包到 Android 中。据此:
https://code.google.com/p/android/issues/detail?id=34193
如果一个函数有多个返回路径,dx会将返回指令合并为一条返回指令,所以在调试过程中,调试器无法判断一个返回属于哪一行,事情会乱跳。这对应于我在尝试重现您的问题时看到的内容:每次通过循环时,它都会执行if (a == 3)
检查,最后跳转到return 0
,然后跳回循环。您会看到最后一个 return 0
与循环中间的 return retval
合并。
我怀疑这个问题很快就会得到解决,所以你可能只需要学会忍受它。抱歉,我知道这有点疯狂。
【讨论】:
谢谢。可惜这个 dx “优化”不能在调试模式下被禁用。 这不是优化。它是 Dalvik VM 的二进制格式;你不能直接在 Android 上运行 .class 文件。 不是 dx 本身;我的意思是它不能像源代码那样创建多个返回指令吗? 这个答案很棒。 我也经历过这种情况……我知道这是有“原因”的,但这根本是不可接受的。这是 dx 中一个需要解决的严重设计问题。 ios 和其他移动平台没有这样的问题,让开发人员的生活变得非常困难【参考方案2】:尝试构建 -> 重建项目,然后 Shift + F9。您在应用程序上运行的代码已过时。
【讨论】:
不,不是那样。清理,重建,重新制作,移动代码也只是为了它 - 没有区别。我创建了一个新的测试项目只是为了检查它,我在实际设备上运行它,而不是模拟器。试试看! 我多年来一直使用 intellij IDEA(相同)进行 android 开发,而您描述的问题仅在我遇到过时的代码时才出现。也许您正在调试库代码?如果没有,那么对不起,我不知道你可能会做错什么。 不,我实际上只是使用 Android Studio 创建了一个新的测试 Android 项目,将代码剪切并粘贴到其中并从 onCreate 调用它,它的行为每次都完全相同。【参考方案3】:这对我有用,至少对于进入 Android SDK 源代码:
-
安装 SDK 平台 和 Android SDK 源,准确您正在运行的 Android 版本的 API 级别在开发期间(使用Android version history 页面了解您的设备具有哪个 API 级别)。
编译您的应用程序正是该版本。例如,在 Android Studio 中,打开您应用的
build.gradle
文件并相应地设置 compileSdkVersion
的值。
调试您的应用。当您进入 Android SDK 源代码时,您应该会看到正确的行。
(可选)在部署前使用最新的 SDK 重新编译。换句话说,把compileSdkVersion
改回来。
【讨论】:
这也适用于无 SDK 代码。我切换了我的最低 API 版本以匹配我的目标设备,现在调试器显示正确的行。以上是关于Android Studio 调试器突出显示错误的行的主要内容,如果未能解决你的问题,请参考以下文章
ReSharper 卸载 - Visual Studio 不再显示正确的错误突出显示
Android Studio 运行/调试配置错误:未指定模块
Visual Studio Code - 有啥方法可以分别突出显示不同类型的错误和警告?
有没有办法改善 Visual Studio Code 中突出显示的 linting 错误?