热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidStudio调试器突出显示了错误的行-AndroidStudiodebuggerhighlightsthewronglines

Icantseeanythingfunctionallywrongintermsofwhatgetsexecuted,butIvejustwastedanhour

I can't see anything functionally wrong in terms of what gets executed, but I've just wasted an hour proving my code and the compiler are doing what they're supposed to.

我看不出在执行什么方面有什么功能上的错误,但我只是浪费了一个小时来证明我的代码和编译器正在做它们应该做的事情。

Consider this code:

考虑这段代码:

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;}

Called with

调用了

int theAnswer = getAnswer(6);

Breakpoint both of the lines containing return and before you run the code, try and predict the result, and therefore which line will be hit.

在运行代码之前,尝试并预测结果,因此会命中哪一行。

As you might imagine from the tone of my question, the wrong line is highlighted, but the right result is returned. If you step through the code, it dances around quite a bit.

正如您可能从我的问题的语气中想象的那样,错误的行被突出显示,但是返回正确的结果。如果您一步一步地完成代码,它就会跳来跳去。

Is there anything that can be configured differently such that the correct lines are displayed? (I'm using the latest Android Studio, which I appreciate is potentially unstable, but I'm sure I've seen similar behaviour on Eclipse a while back but I never spent the time then tracking it down; perhaps it's a java thing).

是否有任何东西可以以不同的方式配置以显示正确的行?(我正在使用最新的Android Studio,我认为它可能不稳定,但我确信我以前在Eclipse上看到过类似的行为,但我从来没有花时间跟踪它;也许是java的东西)。

3 个解决方案

#1


42  

This is a problem with dx, which is the part of the build that turns your Java .class files into .dx files for packaging into Android. According to this:

这是dx的一个问题,它是构建的一部分,将Java .class文件转换成。dx文件,用于打包到Android。根据这个:

https://code.google.com/p/android/issues/detail?id=34193

https://code.google.com/p/android/issues/detail?id=34193

if a function has multiple return paths, dx merges the return instruction into a single return instruction, so during debugging, the debugger can't tell which line a return belongs to and things jump around. This corresponds to what I see when I try to reproduce your problem: each time through the loop it does the if (a == 3) check, jumps to the return 0 at the end, and then jumps back into the loop. You're seeing that last return 0 get merged with the return retval in the middle of the loop.

如果一个函数有多个返回路径,dx将返回指令合并到一个返回指令中,因此调试期间,调试器无法知道返回是属于哪一行的,事情就会跳来跳去。这与我尝试重现您的问题时看到的情况一致:每次循环执行if (a == 3)检查时,在结束时跳转到return 0,然后跳转回循环。您将看到最后一个return 0与循环中间的return retval合并。

I doubt this will be fixed any time soon, so you may just have to learn to live with it. Sorry, I know it's kinda crazy.

我怀疑这个问题不会很快得到解决,所以你可能得学着适应它。对不起,我知道这有点疯狂。

#2


2  

Try Build -> Rebuild project and then Shift + F9. You have outdated code running on application.

尝试Build ->重建项目,然后Shift + F9。在应用程序上运行过时的代码。

#3


2  

Here's what worked for me, at least for stepping into Android SDK source code:

以下是对我有用的东西,至少对于进入Android SDK源代码来说是这样的:

  1. Install the SDK Platform and Sources for Android SDK for exactly the API level of the version of Android you are running during development (use the Android version history page to find out which API level your device has).
  2. 为Android SDK安装SDK平台和源代码,以获得在开发过程中运行的Android版本的API级别(使用Android版本历史页面来查找设备的API级别)。
  3. Compile your app for exactly that version. For example, in Android Studio, open your app's build.gradle file and set the value of compileSdkVersion accordingly.
  4. 为这个版本编译你的应用程序。例如,在Android Studio中,打开应用程序的构建。渐变文件,并设置相应的编译dkversion的值。
  5. Debug your app. When you step into Android SDK source, you should see the correct line.
  6. 调试你的应用程序。当你进入Android SDK源代码时,你应该看到正确的路线。
  7. (optional) Recompile with the latest SDK before deploying. In other words, change compileSdkVersion back.
  8. (可选)部署前使用最新的SDK重新编译。换句话说,更改编译回dkversion。

推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
author-avatar
kkka姐姐_244
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有