【问题标题】:Unable to inspect variables in catch clause when debugging inside a source method在源方法中调试时无法检查 catch 子句中的变量
【发布时间】:2020-01-10 10:57:01
【问题描述】:

在 Android Studio 3.5.3 中调试时,我通常没有问题。但是我在 Android 源代码中调试时偶然发现了一个问题,特别是文件 Sdk\sources\android-28\android\bluetooth\BluetoothGatt.java

一旦在下面指示的断点处暂停,变量e 就不会在“变量”选项卡中列出。不确定这是否是设计使然,如果是这样,是什么原因造成的?是什么导致某些变量可用,而有些则不可用?有多种局部变量可用,但e 变量不可用。

我的断点在这里,第 1259 行:

    try {
        mService.writeDescriptor(mClientIf, device.getAddress(), descriptor.getInstanceId(),
                AUTHENTICATION_NONE, descriptor.getValue());
    } catch (RemoteException e) {
        Log.e(TAG, "", e); // <-- HERE (breakpoint)
        mDeviceBusy = false;
        return false;
    }

使用的系统:

操作系统:Win 10
Android Studio:3.5.3
构建工具:29.0.2
SDK 工具:26.1.1
平台工具:29.0.5
摇篮:3.5.3

测试的设备:
华为 P20 Pro (Android 9)
华为 Mate 9 (Android 9)

PS Log.estatement 应该将 e 变量中包含的堆栈跟踪打印到 LogCat,但是经过彻底检查后无处可寻。所以我对异常变量的内容很感兴趣。

Screenshot demonstrating the aforementioned issue with the debugger

【问题讨论】:

  • 我也喜欢 mDeviceBusy 的值与刚刚分配的值相反 :) 我怀疑您遇到“源代码与字节码不匹配”的情况,也许您收到了该警告,但驳回了吗?您可以通过单步调试器进行仔细检查,并查看它是否立即返回“false”,或者您可以通过尝试单步执行mService.writeDescription() 函数来检查它。
  • 是的,我在某个时候看到了这个警告。进入writeDescription 使其跳转到BluetoothDevice.java:971 中注释块的中间。我注意到this 回答提到了一个解决方案;从设备中提取 .oat 文件并将它们转换为 jar 文件。然而,我对如何让 Android Studio 指向自定义 Android 源进行调试并不了解。
  • 也许见here。另请注意,很可能不会发生异常;您只认为一个是断点位置的 b/c,这当然是错误的。

标签: java android android-studio bluetooth bluetooth-lowenergy


【解决方案1】:

正如评论者指出的那样,调试器实际上并没有在它指示的行上挂起。根据此信息和它单击的方法的返回值:该方法很可能在该方法中较早发生的mDeviceBusy 检查中返回 false。

此外,我在使用蓝牙框架(特别是 BLE)时遇到的问题似乎是由于在操作仍在运行时调用 API 方法引起的。这可能会破坏 Android 蓝牙 API,导致 mDeviceBusy 字段保持为真。

在我禁用了我的应用在连接后立即执行的一些 GATT/BLE 操作后,问题就消失了。解决方案是确保一次只有一个命令处于活动状态,甚至可能在命令之间增加额外的时间。

【讨论】:

    猜你喜欢
    • 2021-07-24
    • 2013-02-13
    • 2010-10-12
    • 2014-12-22
    • 2012-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    相关资源
    最近更新 更多