查看android native crash后的堆栈信息

每次发生android runtime exception后都手足无措,因为拿到的都是如下信息:

adb logcat:

F/libc    (21559): Fatal signal 11 (SIGSEGV) at 0x00030010 (code=1), thread 21578 (m.yunos.browser)

I/DEBUG   (  160): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

I/DEBUG   (  160): Build fingerprint: 'Android/full_mako/mako:4.2.1/JOP40G/eng.yuanzhijun.20130509.085707:userdebug/test-keys'

I/DEBUG   (  160): Revision: '11'

I/DEBUG   (  160): pid: 21559, tid: 21578, name: m.yunos.browser  >>> com.yunos.browser <<<

I/DEBUG   (  160): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00030010

I/DEBUG   (  160):     r0 00030000  r1 74514f0c  r2 0000001c  r3 74252cf8
......
I/DEBUG   (  160): backtrace:

I/DEBUG   (  160):     #00  pc 001879b2  /system/lib/libwebcore.tgl.so

I/DEBUG   (  160):     #01  pc 001b8109  /system/lib/libwebcore.tgl.so
......

只能大概知道是libwebcore.tgl.so里发生了错误,如何能打印出详细的堆栈信息呢?起码也得知道是哪个方法抛的错。

开始我尝试自己写代码来捕获signal,然后再调用backtrace和backtrace_symbols,但在android的linux上用不了两个方法,估计是得装gcc的扩展库,先把这个方案搁置一下,后面再尝试。

然后我再尝试NDK下的ndk-stack,但看语义应该需要NDK编译的才能用,反正我尝试了ndk-stack -sym ...-dump ...后,还是失败,原因是symbols找不到,如果是基于ndk开发的android native应用应该是没问题,但这里我是直接要调试android源码,也搁置一下。

最后尝试用NDK下的addr2line,这个能用,方法就是:

ndk path\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows-x86_64\bin\arm-linux-androideabi-addr2line.exe -C -f -e Y:\webos_nexus4\out\target\product\mako\symbols\system\lib\libwebcore.tgl.so 001879b2
其中Y:\webos_nexus4\out\target\product\mako\symbols\system\lib\libwebcore.tgl.so是编译出的symbols,001879b2对应的是开头看到的堆栈中的地址信息:

I/DEBUG   (  160):     #00  pc 001879b2  /system/lib/libwebcore.tgl.so
运行后得到如下结构:
WebCore::InspectorInstrumentation::instrumentingAgentsForContext(WebCore::ScriptExecutionContext*)
虽然很笨拙,但起码查到了错误发生在哪个方法里。
前面说的两个思路应该可行,我后面再尝试一下


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值