全部产品
云市场

Native_crash

更新时间:2019-10-11 20:23:14

问题分析:

Native的Crash是指在C/C++运行时出错,系统产生了Linux错误信号,导致的进程出错退出。可以通过系统的logcat来分析crash日志。

解决方案:

应用在C/C++运行时出错,系统产生了Linux错误信号,导致的进程出错退出。建议开发者使用NDK工具ndk-stack进行分析定位。

Android开发中,在Java层可以方便的捕获crashlog,但对于Native层的crashlog通常无法直接获取,只能通过系统的logcat来分析crash日志。这里我们建议开发者使用NDK工具ndk-stack进行分析定位。

  1. 下载最新版NDK:NDK下载地址。ndk-stack工具就在NDK主目录下。

  2. 在mqc管理中心找到出现Native Crash的测试,并下载日志。

  3. 根据失败机型查找该机型的CPU信息ro.product.cpu.abi,如图三星N7100的cpu类型为armeabi-v7a。(目前mqc上的模拟器cpu类型均为x86_64。)

  4. 使用ndk-stack分析出错位置,命令格式如下:

    $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/$cpu.abi -dump $LOGCAT_PATH

    本示例使用的命令如下:

    ndk-stack -sym ./workspace2/testNdkStack/obj/local/armeabi-v7a/ -dump ./logcat.log > result.log

    在result.log中可以分析定位到出现该crash的对应代码文件和具体行数。

【 注意】NDK20 有bug,需要自行按照patch进行修改:

  1. diff --git a/ndk-stack.py b/ndk-stack.py
  2. index 93aa0297..f1bb4cd6 100755
  3. --- a/ndk-stack.py
  4. +++ b/ndk-stack.py
  5. @@ -32,6 +32,10 @@ def find_llvm_symbolizer():
  6. Returns: An absolute path to llvm-symbolizer(1)."""
  7. + llvm_symbolizer = 'llvm-symbolizer'
  8. + if os.name == 'nt':
  9. + # Windows has to include the exe or it won't be found.
  10. + llvm_symbolizer += '.exe'
  11. # ndk-stack is installed to $NDK/prebuilt/<platform>/bin, so from
  12. # `~/Downloads/android-ndk-r18/prebuilt/linux-x86_64/bin/ndk-stack`...
  13. # ...get `/usr/enh/Downloads/android-ndk-r18/`:
  14. @@ -42,14 +46,14 @@ def find_llvm_symbolizer():
  15. # And from there construct the llvm-symbolizer path.
  16. llvm_bin = os.path.join(ndk_root, 'toolchains', 'llvm', 'prebuilt', arch,
  17. 'bin')
  18. - path = os.path.join(llvm_bin, 'llvm-symbolizer')
  19. + path = os.path.join(llvm_bin, llvm_symbolizer)
  20. if os.path.exists(path):
  21. return path
  22. # Okay, maybe we're a standalone toolchain? (https://github.com/android-ndk
  23. /ndk/issues/931)
  24. # In that case, llvm-symbolizer and ndk-stack are conveniently in
  25. # the same directory...
  26. - return os.path.abspath(os.path.join(ndk_bin, 'llvm-symbolizer'))
  27. + return os.path.abspath(os.path.join(ndk_bin, llvm_symbolizer))
  28. def main():