c开发安卓so库闪退定位思路


一、c++ 库闪退问题

可以集成腾讯的bugly,这个工具挺方便的,能大致分析出堆栈出错的地方以及函数接口调用。大多数闪退问题的可能就是内存使用不当导致的。如memcpy越界,或者是多次释放指针,又或者是释放了不该释放的内存等等。可以借助bugly定位出具体哪个接口出了问题,然后在具体接口分析。

二、定位分析

1.bugly工具

![在这里插入图片描述](https://img-blog.csdnimg.cn/080ce50013924c298f39244ca757d86c.png在这里插入图片描述
如上图所示,可以很方便看出哪个地方,哪个函数出了问题,然后再根据具体代码进一步进行分析定位!

2.NDK提供的调试工具

NDK安装包中提供了三个调试工具:addr2line、objdump和ndk-stack。我环境是装在ubuntu下的,进入安装目录,找到arm-linux-androideabi-addr2line所在路径,我的是在/toolchains/llvm/prebuilt/linux-x86_64/bin/下,然后执行./toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-addr2line -e “c++所编译的so库全路径” 崩溃时汇编指令地址,如下图,我的显示的是?号,并没有网上所说的具体到哪个函数哪一行:
在这里插入图片描述
不知道哪里操作方法不对,请懂的小伙伴赐教下。第二步,跟我一样的人,可以直接跳过,看第3步骤吧!等有答案了,再更新下哈!

3.adb+logcat方式

第二步行不通,那咋们进行第三环节进行问题分析定位。adb+logcat方式,pc端装个adb.exe工具,手机连上usb,开启开发者调试模式,再连上电脑。

1.进入手机后台操作

pc端输入adb shell,进入到手机的后台,输入logcat,这时屏幕会不停的打印程序的log信息,这时开始测试我们自己的app进行测试,一旦发现app闪退了,屏幕会短暂的停顿,这时,点下鼠标,屏幕就彻底停下来了,我们可以看看这时屏幕打印的相关log信息,笔者的如下图所示,能很清晰的看到哪个函数出现了问题
在这里插入图片描述

2.pc端直接保存crash.log

pc端执行adb logcat > crash.log,会将最近的crash日志保存至pc端目录下,名为crash.log的文件,打开这个文件,也能很清晰的看到最近几天的日志信息,搜索"backtrace",然后再进行上下文查看具体问题,如下图,笔者crash日志中出现了这样一句话,Abort message: ‘Invalid address 0x72a4924000 passed to free: value not allocated’, 意思是free释放的这个0x72a4924000地址,没有被分配。但笔者确实分配了,找了好久的问题,最后发现,分配的地址在后来被移位了,导致free时候闪退。笔者的这个问题还不是必现,偶尔出现下,当时花了几天时间,找各种工具定位,最后通过上面这些方式,终于找到哪里出了问题
在这里插入图片描述

总结

开发程序过程中,出现crash大多数跟内存越界,如memcpy啊,空指针啊,或者多次释放,或者释放不改释放地址造成的,malloc、free或new\delete 这两种方式一定要用对,不然代码量特别大的时候,找问题就不太好找,有些系统下,还不是必现的,或者说,只有在某种特定场景下才会出错,这个时候,问题就更难定位了。所以良好的编程习惯还是有必要的。有句话,怎么说来着,bug一时爽,一直bug一直爽!哈哈哈。

最后祝程序员的世界再无"BUG"!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值