利用addr2line分析堆栈异常

利用addr2line分析堆栈异常,第1张

最近在调屏过程中遇到开不了机的情况,卡在Android启动过程中,从日志饥皮分析只能看到堆栈信息,无法看到具体报错行,为此,需要借助addr2line工具定位信息。

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

[报段错误的地址]

库就是地址后面跟的库

就说这么多呗!


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12353097.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存