
logcat输出如下:
先查看这行栈信息看有没发现:#01 pc 0002c591 /vendor/lib/hw/hwcomposer.amlogic.so
怎么查看呢?address2line 是android ndk工具里自带有,目录在
C:\Users\Motern\AppData\Local\Android\Sdk\ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-addr2line.exe
使用方法如下:
①.根据报错日志找到报错的库文件,清肢并如我要查看这行“#01 pc 0002c591 /vendor/lib/hw/hwcomposer.amlogic.so”,
在系统编译出的symbols符号表找到对应文件,/vendor/lib/hw/hwcomposer.amlogic.so对应的则是
out\答迹target\product\w400\symbols\vendor\lib\hw\hwcomposer.amlogic.so
②.address2line 命令行格式:
arm-linux-androideabi-addr2line -e 【file】-s -f -C [addr(s)]
file:表示要分析的库文件,这里是out\target\product\w400\symbols\vendor\lib\hw\hwcomposer.amlogic.so
addr表示栈地址,这里是0002c591 .
输出如下:
这样我们可以看到程序在DualDisplayPipe.cpp第35行报错。
查看DualDisplayPipe.cpp,可以猜测程序报错是因为配置了双屏,而实际程序获取到屏幕数并没有两个,故抛出异常,我们再查看dts是否配置了双屏确认猜测。
果然,配置的是“dual”双屏,改成单屏“default”,重新编译烧录,顺利进入Android桌面。
今天在此总结旅亩一下:1.普通的应用程序或者静动态库,如果带旦你想用addr2line
来定位段错误出在哪一拆行森行,请记住在编译它们的时候一定加上编译选项
-g
它会生成symbols信息
在你的exe
or
lib
里面。
2.NDK编译生成静动态库就没有必要在Android.mk的编译选项里面加-g了,应为ndk默认就会生成symbols,这个是我做实验得出来的结论。你可以在与jni平行的一层目录中找到libs
和
objs文件夹
在这两个文件夹里面分别可以找到程序运行需要的动态库和含symbols信息的动态库。
至于addr2line的使用方法
,我在这里也啰嗦一句
addr2line
-e
xxxx.so
[报段错误的地址]
库就是地址后面跟的库
就说这么多呗!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)