Android NDK 找到出错的代码位置

  在Android开发中,我们经常遇到以下错误:

2020-04-03 16:32:15.856 15191-15191/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x300000040
2020-04-03 16:32:15.856 15191-15191/? A/DEBUG:     x0  0000000000000000  x1  0000000000000000  x2  0000000000000091  x3  00000079b34ce000
2020-04-03 16:32:15.856 15191-15191/? A/DEBUG:     x4  0000000000000018  x5  b6c0f112e6ded8b7  x6  000000792426bd00  x7  c066241c39b9f253

  一旦出现这种报错,那么如果我们只是做应用层开发的话,基本是懵逼的,因为这种都是底层C或者C++代码出现了错误,代码不在手上,当然无能为力了。但是如果C或C++代码是我们自己写的话,那就能定位出错位置并解决了。

  那么我们该怎么解决呢?

1.找到出错的内存地址

  我们查看Log,找到如下报错日志:

在这里插入图片描述
  很明显,就是我们要分析的这种情况——NDK部分的代码出错了,看Log我们可以知道,这里说的是/lib/arm64/libplayer_lib.so 这个库报错了,具体的报错地址是 000000000001ed40 。

2.使用NDK自带的工具定位错误

  有了之前找到的错误地址,我们就可以用NDK自带的工具“arm-linux-androideabi-addr2line.exe”进行定位了。这里看你的库是什么架构的,我这里是/lib/arm64/,显然不能用这个,而是用 aarch64-linux-android-addr2line.exe 。这个才是支持我这64架构的。

  因为好用,所以我们可以经常用它来解决同类问题。我们可以把 aarch64-linux-android-addr2line.exe 拷贝到我们的工程里来,然后重点来了,我们要怎么用它呢?如下:

aarch64-linux-android-addr2line.exe -e xx.so的文件目录 错误地址 

示例:

aarch64-linux-android-addr2line.exe -e D:\UI\project\ffmpeg\JiayzMediaSDK\JiayzMedia\build\intermediates\cmake\debug\obj\arm64-v8a\libplayer_lib.so 000000000001ed40

看效果:

在这里插入图片描述

  好了,到这里我们就已经找到报错代码在 JiayzAudio.cpp 这个文件的375行。接下来就可以进入代码位置去分析错误了。

  是不是很6,很方便?

发布了14 篇原创文章 · 获赞 0 · 访问量 115

猜你喜欢

转载自blog.csdn.net/york2017/article/details/105668408