在连接了实时设备的情况下单步执行 Eclipse 时,Java 开源视图不正确
Posted
技术标签:
【中文标题】在连接了实时设备的情况下单步执行 Eclipse 时,Java 开源视图不正确【英文标题】:Incorrect java open source view when stepping in Eclipse with live device connected 【发布时间】:2015-03-09 14:18:51 【问题描述】:我正在尝试调试似乎仅在三星 G5 v4.4.4 设备上出现的this android app issue。要尝试跟踪 NullPointerException 的来源,单步执行发出 NPE 信号的 Java 开源代码会有所帮助。问题是,当我们使用三星 G5 v4.4.4 的模拟器时,应用程序不会抛出 NPE我们可以逐行浏览开源代码。但是,当我们将三星 G5 设备连接到 Eclipse 并尝试单步执行代码时,当它进入 java open source 显示源代码但显然不正确。例如,我们知道这一点是因为它似乎在开源中“逐步通过”注释行。已经查看了许多与未找到源代码相关的文章,但在我们的案例中,我们似乎确实有正确的源代码,至少在模拟器调试模式下是这样。
如果有人可以就这个特定的调试问题提供指导,或许它可以帮助我们找出应用问题的原因(仅限三星 G5)。欢迎所有建议。
开发平台Mac OSX 10.9.5。 Eclipse 23.0.2.1259578。 Android SDK 工具 24.0.2 Android SDK 平台工具 Rev 21 Android SDK 内置工具 Rev 21.1.2(也安装了 Rev 20 和 Rev 19.1) 已安装各种 Android API,包括 API 21、20、19m、18、17、16、14 三星 G5 (Sprint) 软件版本 G900PVPU1ANK4,硬件版本 G900P.04。安卓 4.4.4更新:
为了取得一点进展,我逐步浏览了三星(源代码视图大多不正确)和模拟器(源代码视图正确)。两者都被认为是 Android 4.4.4,但我们假设三星已经从 AOSP 进行了修改。通过比较代码行和一些变量状态,我们可以“观察”三星在做什么,即使源代码视图不正确。我不希望任何人都使用这种技术,但它的目的是帮助我们了解一些从我们在三星 G5 上的应用程序中观察到的错误,并在 this SO question 上报告。
【问题讨论】:
【参考方案1】:在这种情况下,首选方法可能是查找特定于供应商的 Android java 源文件并包含对 Eclipse 的引用。但是,供应商并没有让这变得容易,我们也永远无法找到它。
只要小心和耐心,再加上一点运气,只要一个程序与另一个程序有足够的共性,就可以跟踪它。在我们的例子中,Samsung v4.4.4 可以与 Eclipse v4.4.2 进行比较并相互关联以确定导致异常的代码行。首先对与问题相关的代码区域(在您的应用程序和相关开源代码中)有一个基本的了解。然后,您将开始构建“应该”发生什么(无错误)与故障设备“应该”发生什么的地图。这是基本过程:
1.获取一个记事本来记录一步一步的结果。我们有一列是“设备行号”,然后是“仿真器行号”,然后是模块/方法名称,然后是指令。
2、在应用软件中你知道会导致异常的代码行设置断点。
3. 启动模拟器并运行调试到断点。
4. 使用 Step Into 记录堆栈跟踪报告的每一行。当模块/方法发生变化时注意它,如果代码行看起来相关或有趣,也记录下来。
5. 继续在记事本上记录执行的每一行的此信息,直到您知道您已经完成了设备将引发异常的点。
6. 停止执行,(可能重启Eclipse),连接设备,运行调试到断点。
7. 在某些情况下,显示的源代码看起来像是在“执行”注释行,或者会跳转到方法的中间而不是其入口点。您正在寻找可帮助您确定设备在源代码中的运行位置的线索。一个证据是从一个步骤到下一个步骤的行数增加。显然,如果行号增加一,它是一个单行指令。如果它跳了两个或几个,它可能是一个如果。等等。另一个关键信息是调试变量。例如,如果已知“好”源中的一行代码是a = 10;
,那么您有时可以在该代码行之前查看变量a
(例如它可能为空),然后在该代码行之后查看.如果您对源的映射正确,那么您将看到 a
的值更改为 10。
这仅适用于相对相同的代码。例如,我们看到 4.4.4 的三星源在某些情况下会偏离 50 甚至 100 多行,就好像供应商插入了一种新方法一样。但是我们能够通过我们可以查看的源来追踪它。是否值得花时间,很难说。最后我们意识到空指针是我们无法克服的,我们选择了一种完全不同的方法来实现目标。
【讨论】:
以上是关于在连接了实时设备的情况下单步执行 Eclipse 时,Java 开源视图不正确的主要内容,如果未能解决你的问题,请参考以下文章