camera crash很是让人崩溃,遇到这种问题,出来一大堆地址和报错的库。看着很头大,我们常见的方法addr2line来解析到是哪一个函数,哪一行报错,这样子的话,分析起来问题,范围就会缩小很多。
首先看一个camera crash的log。
06-04 14:33:13.860 411 17923 F libc : Fatal signal 11 (SIGSEGV), code 1, fault addr 0x69b69a86 in tid 17923 (CAM_stMachine)
06-04 14:33:14.096 18030 18030 F DEBUG : xtc_crash_begin:
06-04 14:33:14.096 18030 18030 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
06-04 14:33:14.096 18030 18030 F DEBUG : Build fingerprint: 'XTC/msm8909w_i18/msm8909w_i18:7.1.1/NMF26F/liwanc06031847:userdebug/release-keys'
06-04 14:33:14.097 18030 18030 F DEBUG : Revision: '0'
06-04 14:33:14.097 18030 18030 F DEBUG : ABI: 'arm'
06-04 14:33:14.097 18030 18030 F DEBUG : pid: 411, tid: 17923, name: CAM_stMachine >>> /system/bin/cameraserver <<<
06-04 14:33:14.097 18030 18030 F DEBUG : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x69b69a86
06-04 14:33:14.097 18030 18030 F DEBUG : r0 b547d000 r1 b60a8648 r2 ffffffff r3 69b69a87
06-04 14:33:14.098 18030 18030 F DEBUG : r4 b5419258 r5 b6b7d158 r6 b5419030 r7 b5419000
06-04 14:33:14.098 18030 18030 F DEBUG : r8 00000002 r9 b6b6a8a3 sl b6b6a858 fp b6b6a8e0
06-04 14:33:14.098 18030 18030 F DEBUG : ip b5419000 sp b587f7d0 lr b6b498cb pc 69b69a86 cpsr a00f0030
06-04 14:33:14.160 18030 18030 F DEBUG :
06-04 14:33:14.160 18030 18030 F DEBUG : backtrace:
06-04 14:33:14.164 18030 18030 F DEBUG : #00 pc 69b69a86 <unknown>
06-04 14:33:14.164 18030 18030 F DEBUG : #01 pc 0002a8c9 /system/lib/hw/camera.msm8909.so (_ZN7qcamera20QCameraGrallocMemory10deallocateEv+140)
06-04 14:33:14.164 18030 18030 F DEBUG : #02 pc 00031007 /system/lib/hw/camera.msm8909.so (_ZN7qcamera13QCameraStream12releaseBuffsEv+110)
06-04 14:33:14.164 18030 18030 F DEBUG : #03 pc 00031391 /system/lib/hw/camera.msm8909.so (_ZN7qcamera13QCameraStreamD1Ev+44)
06-04 14:33:14.164 18030 18030 F DEBUG : #04 pc 000313d1 /system/lib/hw/camera.msm8909.so (_ZN7qcamera13QCameraStreamD0Ev+4)
06-04 14:33:14.164 18030 18030 F DEBUG : #05 pc 0002ea2f /system/lib/hw/camera.msm8909.so (_ZN7qcamera14QCameraChannelD1Ev+50)
06-04 14:33:14.164 18030 18030 F DEBUG : #06 pc 0002ea7f /system/lib/hw/camera.msm8909.so (_ZN7qcamera17QCameraPicChannelD1Ev+14)
06-04 14:33:14.164 18030 18030 F DEBUG : #07 pc 0002ea91 /system/lib/hw/camera.msm8909.so (_ZN7qcamera17QCameraPicChannelD0Ev+4)
06-04 14:33:14.164 18030 18030 F DEBUG : #08 pc 0002583f /system/lib/hw/camera.msm8909.so (_ZN7qcamera25QCamera2HardwareInterface10delChannelENS_22qcamera_ch_type_enum_tEb+18)
06-04 14:33:14.164 18030 18030 F DEBUG : #09 pc 00027d9b /system/lib/hw/camera.msm8909.so (_ZN7qcamera25QCamera2HardwareInterface13cancelPictureEv+174)
06-04 14:33:14.164 18030 18030 F DEBUG : #10 pc 0002d8e7 /system/lib/hw/camera.msm8909.so (_ZN7qcamera19QCameraStateMachine21procEvtPicTakingStateENS_21qcamera_sm_evt_enum_tEPv+846)
06-04 14:33:14.164 18030 18030 F DEBUG : #11 pc 0002e773 /system/lib/hw/camera.msm8909.so (_ZN7qcamera19QCameraStateMachine16smEvtProcRoutineEPv+174)
06-04 14:33:14.164 18030 18030 F DEBUG : #12 pc 000473b3 /system/lib/libc.so (_ZL15__pthread_startPv+22)
06-04 14:33:14.165 18030 18030 F DEBUG : #13 pc 0001a0bd /system/lib/libc.so (__start_thread+6)
06-04 14:33:15.683 18030 18030 F DEBUG : xtc_crash_end:
06-04 15:02:19.435 18060 23672 F libc : Fatal signal 11 (SIGSEGV), code 1, fault addr 0xb651da03 in tid 23672 (CAM_stMachine)
06-04 15:02:19.615 23783 23783 F DEBUG : xtc_crash_begin:
06-04 14:33:14.164 18030 18030 F DEBUG : #01 pc 0002a8c9 /system/lib/hw/camera.msm8909.so
06-04 14:33:14.164 18030 18030 F DEBUG : #02 pc 00031007 /system/lib/hw/camera.msm8909.so
06-04 14:33:14.164 18030 18030 F DEBUG : #03 pc 00031391 /system/lib/hw/camera.msm8909.so
看这三行,表示报错的库是在camera.msm8909.so这个库里面报错了,错误的地址是0002a8c9。
这个库的地址要注意,是在/out/target/product/msm8909w_i18/symbols/system$这个路径下面,然后执行如下命令:
addr2line -f -e camera.msm8909.so 0002a8c9 这样子就可以直接解析出来出错的是哪一个函数,那一行。
---------------------------------------------------------------------------------------------------------------------------------------------
不要高兴的太早,这种方法只是缩小了出现问题的范围,但是八九不离十。问题就是这一块。接下来就要自己去加log,一步一步去排除。一般是空指针,或者就是某个库没有正确加载。
下面列举一个例子,自己导致的camera crash。就是有一次在添加otp的时候,所有的代码都添加上去,但是每次烧进去版本,打开camera都是crash掉了,很崩溃啊。因为自己做高通不久,之前是做mtk的,经验也比较少。用上面的方法只能定位出来,肯定是otp错误了。其实这样一来,问题的范围也缩小了很多,接下来就重点分析otp。
首先在otp驱动里面自己添加log,突然发现啊,otp驱动里面的log,没有一句是打印出来的,这就奇怪了。
我们都知道,eeprom驱动,sensor驱动,其实最后编译出来的就是一个库文件,只要正确加载了这个库文件,那么eeprom驱动里面的log肯定是可以打印出来的。因为一句log都没有,所以怀疑这个库没有正确加载。
eeprom驱动编译出来的库是在eeporm.c文件里面加载的,有一个函数是eeprom_load_library。这个函数就是用来加载eeprom驱动编译出来的那个库的。自己加log,发现是eeporm驱动的入口函数写错了,这个入口函数其实是有一定的规定的。因为这个代码是模组厂扔过来的,所以就没怎么仔细看。改正了驱动里面的入口函数名字就解决掉这个问题了。