【摘要】 最近遇到一个空指针问题,根据这个问题了解到reference与dereference所表示的具体含义
空指针问题报错的堆栈如下:
pid: 2433, tid: 2948, name: CamSensor >>> /vendor/bin/hw/android.hardware.camera.provider@2.4-service <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
Cause: null pointer dereference
r0 f1908270 r1 00000000 r2 00000001 r3 00000000
r4 00000000 r5 00000000 r6 00000000 r7 00000000
r8 f193e000 r9 5706443b r10 ef5d4331 r11 ffffffff
ip ef5dc68c sp ef345820 lr ef5a4bdd pc ef5a4e2a
backtrace:
#00 pc 0001ce2a /vendor/lib/hw/camera.****.so (android::Sensor::threadLoop()+1058)
#01 pc 0000c013 /system/lib/vndk-sp-28/libutils.so (android::Thread::_threadLoop(void*)+290)
#02 pc 00063685 /system/lib/libc.so (__pthread_start(void*)+22)
#03 pc 0001dfd9 /system/lib/libc.so (__start_thread+24)
反编译出地址如下,在行34、37上
到底是哪个为空的?数组还是数组中元素
首先采用的方法是使用IDA,把symbols反编译出来,对照汇编语言查看,硬看也只是能看懂一部分
后来遇到一篇文章《引用:&(reference)与间接引用:*(dereference)》
《Effective C++》中也有讲
发现tombstone中报错信息是”空指针的间接引用”,那就是间接引用的地方是空
即引用不能为空(NULL),引用必须与合法的存储单元关联,指针则可以是NULL)
知道错误行后,就可以进行修改了,具体修改如下: