這是Android藍牙代碼中的一個錯誤,目前似乎沒有解決方案。由於其他人也一直在尋找這一點,所以我會發布通過藍牙堆棧追蹤問題時發現的內容,即使它不能用作解決方案,除非有人準備對基於AOSP的系統進行重大更改安裝。
基本上,問題是在聽到太多獨特的BTLE硬件地址後,alloc_node()失敗時,在find_add_node()的btif_config.c中出現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 <[email protected]>
這對應於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()的失敗,所以當發生這種情況(大概是由於在聽到太多的設備地址之後用完存儲器)代碼將通過並嘗試取消引用節點指針沒有被設置爲非空地址。
一個修復大概需要涉及:當一個新的記錄不能被分配
過去,當聽到地址更積極丟棄這個錯誤情況
非碰撞處理新的不斷收聽,並且存儲的記錄數量變得不合理
是的,Android平臺代碼的內部邏輯中存在未處理的情況,它假定它始終能夠分配遠程設備記錄,並且如果無法完全崩潰。嘗試簡單地切換飛行模式,因爲這可能會清除設備記錄(儘管電源循環不會)。否則,工廠重置肯定會。 –
無論如何,直接進入Qualcomm驅動程序並編寫我們自己的實現,因爲Android平臺代碼不好?有人可能已經做到了這一點? – MasterGberry
不,除非您能夠在設備上安裝自己的基於AOSP的版本(儘管如果您有root用戶,您可能會粗略清除記錄)。飛機模式是否暫時爲您清除? –