前段时间在做海思的项目,自己又遇到了和media有关的tombstone的问题,此时非常的纠结。。。百般挫折,终于从芯片的工程师那得知了一个方法可以确认具体的位置。
废话不多说,方法如下:
不过注意的是,这个方法一定要有源码和编译源码的环境,并且你已经编译过了,而且机器用的是你编译的系统。。。如果没有这个环境和条件,那么后面就不需要看了。白搭。。。看了也白看。。。如果你有上面提到的环境,那么恭喜你,请继续往下看。。。
首先找到tombstone的日志
其他不用看,只看如下的内容:
backtrace:
#00 pc 00003558 /system/lib/libcutils.so (android_atomic_inc+8)
#01 pc 0000d0d1 /system/lib/libutils.so (android::RefBase::incStrong(void const*) const+6)
#02 pc 00018c0f /system/lib/libmedia_jni.so
#03 pc 00019b59 /system/lib/libmedia_jni.so
....
这个堆栈是从下往上看,最上面是最后一步调用出错的地方。调用顺序是从下往上。
紧接着,去你的系统代码目录找:out/target/product/xxxx/obj/lib目录,cd到这个目录下。
xxx表示你编译的产品名
假设现在我们想要找到01出错的位置
则可以addr2line 00018c0f -e libmedia_jni.so(也可以使用prebuilts里面的arm-eabi-addr2line)
由于我是海思平台我使用海思自带的arm-hisiv200-linux-addr2line命令,显示的结果如下:
getVideoSurfaceTexture(android_media_MediaPlayer.cpp 245)
这个时候可以很明显的显示出错的具体文件,以及文件出错的位置。