Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300847
  • 博文数量: 43
  • 博客积分: 2071
  • 博客等级: 大尉
  • 技术积分: 488
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-25 17:48
文章分类

全部博文(43)

文章存档

2014年(5)

2013年(4)

2011年(9)

2010年(8)

2009年(17)

我的朋友

分类: LINUX

2011-09-09 09:40:50

转自: http://tassardge.blog.163.com/blog/static/17230170820114125337103/

这几天,一直在折腾 android 上的蓝牙问题。具体现象是,在android的settings里面一点击bluetooth,android就会crash并导致anroid重启。运行环境是linux 2.6.32内核,android 2.3。

崩溃的log见下文:

I//system/bin/bluetoothd( 484): bluetoothd[485]: Bluetooth deamon 4.69
I//system/bin/bluetoothd( 484): bluetoothd[485]: Starting SDP server
I//system/bin/bluetoothd( 484): bluetoothd[485]: Got Unix socket fd '10' from environment
I//system/bin/bluetoothd( 484): bluetoothd[485]: Adding device id record for 000a:0000
I//system/bin/bluetoothd( 484): bluetoothd[485]: HCI dev 0 registered
I//system/bin/bluetoothd( 484): bluetoothd[485]: HCI dev 0 up
I//system/bin/bluetoothd( 484): bluetoothd[485]: Starting security manager 0
I//system/bin/bluetoothd( 484): bluetoothd[485]: ioctl(HCIUNBLOCKADDR): Invalid argument (22)
I//system/bin/bluetoothd( 484): bluetoothd[485]: Adapter /org/bluez/485/hci0 has been enabled
I//system/bin/bluetoothd( 484): bluetoothd[485]: Inquiry Failed with status 0x12
I/DEBUG ( 103): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 103): Build fingerprint: 'map200/FT2M/FT2M:2.3.1/GRH78/eng.publisher.20110510.110351:eng/test-keys'
I/DEBUG ( 103): pid: 133, tid: 481 >>> system_server <<<
I/DEBUG ( 103): signal 7 (SIGBUS), code 128 (?), fault addr 00000000
I/DEBUG ( 103): r0 ae718e98 r1 ae735058 r2 fffe3e40 r3 00000000
I/DEBUG ( 103): r4 4be2caf7 r5 00214eb0 r6 00000031 r7 4be2ca54
I/DEBUG ( 103): r8 4be2cb58 r9 49228f80 10 49228f68 fp 45116fb4
I/DEBUG ( 103): ip 00000073 sp 4be2c978 lr ae718e57 pc ae718e98 cpsr a0000030
I/DEBUG ( 103): #00 pc 00018e98 /system/lib/libdbus.so
I/DEBUG ( 103): #01 pc 0001b7a8 /system/lib/libdbus.so
I/DEBUG ( 103): #02 pc 0001fb62 /system/lib/libdbus.so
I/DEBUG ( 103): #03 pc 00020436 /system/lib/libdbus.so
I/DEBUG ( 103): #04 pc 0002057c /system/lib/libdbus.so
I/DEBUG ( 103): #05 pc 0006eafe /system/lib/libandroid_runtime.so
I/DEBUG ( 103): #06 pc 0006ec8e /system/lib/libandroid_runtime.so
I/DEBUG ( 103): #07 pc 0006edc8 /system/lib/libandroid_runtime.so
I/DEBUG ( 103): #08 pc 00011d34 /system/lib/libdvm.so
I/DEBUG ( 103): #09 pc 00042ec0 /system/lib/libdvm.so
I/DEBUG ( 103): #10 pc 0003ba6a /system/lib/libdvm.so
I/DEBUG ( 103): #11 pc 00016f94 /system/lib/libdvm.so
I/DEBUG ( 103): #12 pc 0001c09c /system/lib/libdvm.so
I/DEBUG ( 103): #13 pc 0001af90 /system/lib/libdvm.so
I/DEBUG ( 103): #14 pc 00059328 /system/lib/libdvm.so
I/DEBUG ( 103): #15 pc 0005954e /system/lib/libdvm.so
I/DEBUG ( 103): #16 pc 0004db06 /system/lib/libdvm.so
I/DEBUG ( 103): #17 pc 00011a7c /system/lib/libc.so
I/DEBUG ( 103): #18 pc 00011640 /system/lib/libc.so
I/DEBUG ( 103):
I/DEBUG ( 103): code around pc:
I/DEBUG ( 103): ae718e78 d0552c00 2f002001 3601d052 e04f603e
I/DEBUG ( 103): ae718e88 1c288822 9b0a1c31 f7ff9700 e047ff73
I/DEBUG ( 103): ae718e98 1e536822 e000419a 1c286822 9b0a1c31
I/DEBUG ( 103): ae718ea8 f7ff9700 e03bfe3f 6822990a 1c286863
I/DEBUG ( 103): ae718eb8 1c319100 f7ff9701 e031fdff 491e6820
I/DEBUG ( 103):
I/DEBUG ( 103): code around lr:
I/DEBUG ( 103): ae718e34 9f0b9203 faccf00d 41981e43 493b4b3a
I/DEBUG ( 103): ae718e44 447b4a3b 93003354 4b3a4479 f7fd447a
I/DEBUG ( 103): ae718e54 9b03fc81 2b173b62 4937d85d 44790098
I/DEBUG ( 103): ae718e64 18505842 78224687 1c311c28 fdc2f011
I/DEBUG ( 103): ae718e74 20001c04 d0552c00 2f002001 3601d052
I/DEBUG ( 103):
I/DEBUG ( 103): stack:
I/DEBUG ( 103): 4be2c938 00214e74 [heap]
I/DEBUG ( 103): 4be2c93c 00286008 [heap]
I/DEBUG ( 103): 4be2c940 00000062
I/DEBUG ( 103): 4be2c944 ae73d7af /system/lib/libdbus.so
I/DEBUG ( 103): 4be2c948 0001c076 [heap]
I/DEBUG ( 103): 4be2c94c ae7263fd /system/lib/libdbus.so
I/DEBUG ( 103): 4be2c950 ae736b20 /system/lib/libdbus.so
I/DEBUG ( 103): 4be2c954 00214e74 [heap]
I/DEBUG ( 103): 4be2c958 0028aa08 [heap]
I/DEBUG ( 103): 4be2c95c ae736b20 /system/lib/libdbus.so
I/DEBUG ( 103): 4be2c960 0028aa08 [heap]
I/DEBUG ( 103): 4be2c964 4be2caf7
I/DEBUG ( 103): 4be2c968 4be2caf7
I/DEBUG ( 103): 4be2c96c 00214eb0 [heap]
I/DEBUG ( 103): 4be2c970 df002777
I/DEBUG ( 103): 4be2c974 e3a070ad
I/DEBUG ( 103): #00 4be2c978 ae735368 /system/lib/libdbus.so
I/DEBUG ( 103): 4be2c97c 0028aa08 [heap]
I/DEBUG ( 103): 4be2c980 00000001
I/DEBUG ( 103): 4be2c984 00000062
I/DEBUG ( 103): 4be2c988 ae735f70 /system/lib/libdbus.so
I/DEBUG ( 103): 4be2c98c 4be2ca44
I/DEBUG ( 103): 4be2c990 00000062
I/DEBUG ( 103): 4be2c994 4be2caf7
I/DEBUG ( 103): 4be2c998 ae735f70 /system/lib/libdbus.so
I/DEBUG ( 103): 4be2c99c ae71b7ad /system/lib/libdbus.so
I/DEBUG ( 103): #01 4be2c9a0 0000006c
I/DEBUG ( 103): 4be2c9a4 4be2ca54
I/DEBUG ( 103): 4be2c9a8 ae73c270 /system/lib/libdbus.so
I/DEBUG ( 103): 4be2c9ac ae738470 /system/lib/libdbus.so
I/DEBUG ( 103): 4be2c9b0 ae742478 /system/lib/libdbus.so
I/DEBUG ( 103): 4be2c9b4 ae71fb67 /system/lib/libdbus.so
^C

最终的原因是:
frameworks\base\core\jni \android_server_BluetoothEventLoop.cpp的函数register_agent向external\dbus \dbus\dbus-marshal-basic.c的函数_dbus_marshal_write_basic传了一个 DBUS_TYPE_BOOLEAN参数,见如下代码:

dbus_message_append_args(msg, DBUS_TYPE_OBJECT_PATH, &agent_path,
DBUS_TYPE_STRING, &capabilities,
DBUS_TYPE_BOOLEAN, &oob,
DBUS_TYPE_INVALID);

注意,这个oob是c++内建的bool型,它的size是可以由编译选项设置的,我的编译器把bool设置为1个字节,而正是这导致了crash。因为函数_dbus_marshal_write_basic处理 DBUS_TYPE_BOOLEAN时候,把bool作为4个字节处理,这导致内存访问越界,最终 crash。

下面是具体的分析过程:
首先分析上面的crash log,根据函数堆栈找到崩溃函数。光凭这份log很难下手,所以采用这篇文章中的方法分析link。另外,分析的过程中不但要找到导致崩溃的那行代码,也要找到堆栈里面的每一个函数调用对应的c代码,这样更容易分析。

汇编代码显示是下面代码里面的vp->u32访问了空指针导致崩溃,但是根据崩溃处的寄存器值判断vp不是空指针,那为什么会访问空指针呢?
return marshal_4_octets (str, insert_at, vp->u32 != FALSE,
byte_order, pos_after);

再进一步观察,发现vp的类型是一个如下的union,并且上面那句代码的含义是把bool型数据作为4个字节来处理。所以,我想很可能是传给_dbus_marshal_write_basic的bool的size不是4字节导致的问题。
typedef union
{
dbus_int16_t i16; /**< as int16 */
dbus_uint16_t u16; /**< as int16 */
dbus_int32_t i32; /**< as int32 */
dbus_uint32_t u32; /**< as int32 */
#ifdef DBUS_HAVE_INT64
dbus_int64_t i64; /**< as int64 */
dbus_uint64_t u64; /**< as int64 */
#else
DBus8ByteStruct u64; /**< as 8-byte-struct */
#endif
double dbl; /**< as double */
unsigned char byt; /**< as byte */
char *str; /**< as char* */
} DBusBasicValue;

继续在函数堆栈中查找是哪个函数向它传递的参数,发现是frameworks\base\core\jni \android_server_BluetoothEventLoop.cpp的函数register_agent,果然它传递的bool型只有一个字节。从而找到了上面提到的原因。
阅读(3224) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~