如何使用ndk中addr2line工具查询so库中错误信息行数

如何使用ndk中addr2line工具查询so库中错误信息行数。
jni现在在android项目中已经非常常见了,但是错误信息并不想android那样友好。
常见的c错误如下:

2020-03-12 12:13:49.055 10000-10372/com.tianchen.cloud_disk A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x454d414b in tid 10372 (Thread-284)
2020-03-12 12:13:49.130 10373-10373/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2020-03-12 12:13:49.131 10373-10373/? A/DEBUG: Build fingerprint: 'Android/rk3399_roc_pc/rk3399_roc_pc:7.1.2/NHG47K/lzf10261000:userdebug/test-keys'
2020-03-12 12:13:49.131 10373-10373/? A/DEBUG: Revision: '0'
2020-03-12 12:13:49.131 10373-10373/? A/DEBUG: ABI: 'arm'
2020-03-12 12:13:49.131 10373-10373/? A/DEBUG: pid: 10000, tid: 10372, name: Thread-284  >>> com.tianchen.cloud_disk <<<
2020-03-12 12:13:49.131 10373-10373/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x454d414b
2020-03-12 12:13:49.131 10373-10373/? A/DEBUG:     r0 c911f878  r1 00000000  r2 1fb5602b  r3 c8ffafac
2020-03-12 12:13:49.131 10373-10373/? A/DEBUG:     r4 454d414b  r5 df3a1c00  r6 c911f878  r7 0000001d
2020-03-12 12:13:49.131 10373-10373/? A/DEBUG:     r8 df3d1100  r9 2815ed9d  sl caa41ee4  fp c5ab4654
2020-03-12 12:13:49.131 10373-10373/? A/DEBUG:     ip 05600000  sp c5ab4638  lr c8ffad60  pc c8ffad58  cpsr 20010010
2020-03-12 12:13:49.132 10373-10373/? A/DEBUG: backtrace:
2020-03-12 12:13:49.132 10373-10373/? A/DEBUG:     #00 pc 000a6d58  /data/app/com.tianchen.cloud_disk-2/lib/arm/libicbp.so
2020-03-12 12:13:49.133 10373-10373/? A/DEBUG:     #01 pc 0003ed70  /data/app/com.tianchen.cloud_disk-2/lib/arm/libicbp.so

backtrace中包含了出错的库,那么具体函数就要用到addr2line。
工具具体位置:ndk路径下 \toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin
使用如下:
在有问题的so目录下新建bat文件:

@echo off
rem current direction
set cur_dir=%cd%
 
rem addr2line tool path
set add2line_path=D:\android-ndk-r13b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-addr2line.exe
 
rem debug file
set /p debug_file=请输入当前目录下debug文件名:
 
rem debug_file_path
set debug_file_path=%cur_dir%\%debug_file%
 
rem debug address
set /p debug_addr=请输入异常时PC寄存器值:
 
echo ----------------------- addr2line ------------------------
echo debug文件路径: %debug_file_path%  PC=%debug_addr%
 
if exist %debug_file_path% (
%add2line_path% -e %debug_file_path% -f %debug_addr% 
) else (
echo debug file is no exist. 
)
 
echo ---------------------------------------------------------
pause

然后设置自己的addr2line工具就行了,然后运行。
第一输入so名称。
第二数据pc后面地址信息。
效果如下:
在这里插入图片描述

发布了187 篇原创文章 · 获赞 65 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/mhhyoucom/article/details/104817222
今日推荐