80,449
社区成员




背景是这样的:
硬件环境:8155
软件环境:QNX+ Android(运行在Hyperisor中)
本人负责DDS中间件的维护,封装了JNI和JAR包给上层JAVA使用,最近测试报票,说使用了该JAR包的进程出现crash,并且提供了墓碑文件
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x1401d65f03f0
x0 0000006f376782c8 x1 0000000000000081 x2 000000007fffffff x3 0000000000000000
x4 0000000000000000 x5 0000000000000000 x6 0000000000000000 x7 ffffffea6989a4db
x8 b9001401d65f03c0 x9 b2333876f5c4e0a6 x10 0000000000000000 x11 0000000000000002
x12 00000000fffffffe x13 00000000fffffffe x14 00000000fffffffe x15 0000000000000002
x16 0000006fda331230 x17 0000006fda261010 x18 0000000000000001 x19 0000006f529d8740
x20 0000006f529d8800 x21 0000006f3857e700 x22 0000000000000000 x23 0000006f2ee21588
x24 0000006f3791cc10 x25 0000006f529d8400 x26 0000006f529d8400 x27 0000006f303f3270
x28 0000006f303f3288 x29 0000006f2ee200a0
sp 0000006f2ee20060 lr 0000006f378009c8 pc 0000006f378009c0
发生crash时PC寄存器的地址是0000006f378009c0
然后对发生问题的so进行反编译,获取到地址对应的汇编代码如下:
3899bc: f9400008 ldr x8, [x0]
3899c0: f9401908 ldr x8, [x8,#48]
3899c4: d63f0100 blr x8
根据该行汇编代码,0xb9001401d65f03c0(x8寄存器存放的值) + 0x30应该等于0xb9001401d65f03f0,也就是3899c0该行ldr指令应该从0xb9001401d65f03f0对应的内存地址获取其中存放的WORD值,但是现在墓碑显示的是ldr指令从0x1401d65f03f0这个内存地址去获取WORD值。
0x1401d65f03f0
0xb9001401d65f03f0
0xb9001401d65f03f0
从上面这个对比,发现LDR取值的时候,丢失了地址的高2位,这个现象之前也在别的进程发现过,不知道有没有高手大佬给点思路?