gpt4 book ai didi

android - "Bluetooth share has stopped working"执行LeScan时

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:20:22 25 4
gpt4 key购买 nike

我面前有一堆各种各样的 Android 手机都运行 4.3/4.4,它们似乎都存在蓝牙问题。我正在运行的应用程序只是使用此回调扫描周围的其他蓝牙设备:http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.LeScanCallback.html

只是对数据进行 LogCatting,但仍有问题...

有没有人知道这个错误并修复了它?我真的需要在明天为我的应用程序演示准备的最后期限之前稳定蓝牙扫描...

谢谢。

编辑:据说在 4.4.3(或 4.4.4)中已解决。 (当然,我们介绍项目的那天……对我们没有好处)。主要问题是 XML 文件跟踪 mac 地址增长超过 2000 的大小然后崩溃...系统重置将清除 xml 文件,从而暂时解决问题。

最佳答案

这是 Android 蓝牙代码中的一个错误,目前似乎没有解决方案。由于其他人也不断发现这一点,我将发布我在通过蓝牙堆栈跟踪问题时发现的内容,即使它不能真正作为解决方案应用,除非有人准备对基于 AOSP 的系统进行重大更改安装。

从根本上说,问题是当 alloc_node() 在听到太多唯一的 BTLE 硬件地址后失败时,btif_config.c 中的 find_add_node() 出现 SIGSEGV。

堆栈跟踪的信息部分

D/BtGatt.btif(22509): btif_gattc_upstreams_evt: Event 4096
D/BtGatt.btif(22509): btif_gattc_add_remote_bdaddr device added idx=1
D/BtGatt.btif(22509): btif_gattc_update_properties BLE device name=beacon len=6 dev_type=2
F/libc (22509): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 22530 (BTIF)
I/DEBUG ( 171): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 171): Build fingerprint: 'google/occam/mako:4.4.2/KOT49H/937116:user/release-keys'
I/DEBUG ( 171): Revision: '11'
I/DEBUG ( 171): pid: 22509, tid: 22530, name: BTIF >>> com.android.bluetooth <<<
I/DEBUG ( 171): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG ( 171): r0 ffffffff r1 00007d00 r2 00007c60 r3 74c7cf00
I/DEBUG ( 171): r4 74c7cf10 r5 00000000 r6 756f95a8 r7 7503c671

I/DEBUG ( 171): backtrace:
I/DEBUG ( 171): #00 pc 0004e68c /system/lib/hw/bluetooth.default.so
I/DEBUG ( 171): #01 pc 0004ea65 /system/lib/hw/bluetooth.default.so (btif_config_set+156)

反汇编,有问题的代码是这一系列明显有问题的清除 r5,然后尝试将其取消引用为基指针:

       4e68a:   2500        movs    r5, #0
4e68c: 6829 ldr r1, [r5, #0]
4e68e: b919 cbnz r1, 4e698 <btif_gattc_test_command_impl+0x74c>
4e690: 4630 mov r0, r6
4e692: f7dd ef78 blx 2c584 <strdup@plt>

这对应于 find_add_node() 末尾的“if(!node->name)”检查

static cfg_node* find_add_node(cfg_node* p, const char* name)
{
int i = -1;
cfg_node* node = NULL;
if((i = find_inode(p, name)) < 0)
{
if(!(node = find_free_node(p)))
{
int old_size = alloc_node(p, CFG_GROW_SIZE);
if(old_size >= 0)
{
i = GET_NODE_COUNT(old_size);
node = &p->child[i];
ADD_CHILD_COUNT(p, 1);
} /* else clause to handle failure of alloc_node() is missing here */
} else ADD_CHILD_COUNT(p, 1);
}
else node = &p->child[i];
if(!node->name) /* this will SIGSEGV if node is still NULL */
node->name = strdup(name);
return node;
}

具体来说,没有 else 子句来处理 alloc_node() 的失败,所以当这种情况发生时(可能是由于听到太多设备地址后存储空间不足)代码失败并尝试取消引用 name 成员节点指针,而无需将其设置为非空地址。

修复可能需要涉及:

  1. 无法分配新记录时对这种错误情况的非崩溃处理

  2. 当不断听到新地址并且存储的记录数量变得不合理时,更积极地丢弃过去听到的地址

关于android - "Bluetooth share has stopped working"执行LeScan时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22048721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com