1

我正在尝试调试这个 似乎只出现在三星 G5 v4.4.4 设备上的Android 应用程序问题。为了尝试追踪 NullPointerException 的来源,单步执行发出 NPE 信号的 Java 开源代码会有所帮助。问题是当我们使用三星 G5 v4.4.4 的模拟器时,该应用程序不会抛出 NPE ,我们能够逐行通过开源代码。但是,当我们将三星 G5 设备连接到 Eclipse 并尝试单步执行代码时,当它进入 java 开源时,显示源代码但显然不正确. 例如,我们知道这一点是因为它似乎在开源中“逐步通过”注释行。已经查看了许多与未找到源代码相关的文章,但在我们的案例中,我们似乎确实有正确的源代码,至少在模拟器调试模式下是这样。

如果有人可以就这个特定的调试问题提供指导,也许它可以帮助我们找出应用程序问题的原因(仅限三星 G5)。欢迎所有建议。

  • 开发平台 Mac OSX 10.9.5。
  • 日食 23.0.2.1259578。
  • 安卓 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 上的应用程序中观察到的错误并报告这个 SO question

4

1 回答 1

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 多行,就好像供应商插入了一种新方法一样。但是我们能够通过我们可以查看的源来追踪它。是否值得花时间,很难说。最后我们意识到空指针是我们无法克服的,我们选择了一种完全不同的方法来实现目标。

于 2015-01-15T05:29:44.850 回答