NDK调试方法

1.addr2line

根据Android崩溃日志定位问题出处

崩溃日志一般都会有如下形式打印

I/DEBUG   (  155): backtrace:

I/DEBUG   (  155):     #00  pc 00000000  <unknown>

I/DEBUG   (  155):     #01  pc 002248d9  /data/data/com.x.x.x/lib/libx.so (CTest::onRequest(int, _tagASSIST_SERVER*)+16)

其实这个就是崩溃栈,通常都指明了出问题的函数,我们就可以仔细排查一下CTest::onRequest函数。

也可以通过命令 (002248d9就是libx.so中某个函数的地址)

arm-linux-androideabi-addr2line.exe -C -f -e libx.so 002248d9 来定位出问题的函数


2.NDK-STACK

ndk-stack 工具让您可以在堆叠追踪出现在 adb logcat 的输出中时过滤它们。 它还可以从源代码将共享库中的任意地址替换为对应的< source-file: < line-number> 值,从而更容易找出问题所在。

例如,它可将下面的crash log:

I/DEBUG  (31):************************************************I/DEBUG  (31): Build fingerprint:'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'I/DEBUG  (31): pid:351, tid:351%gt;%gt;%gt; /data/local/ndk-tests/crasher<<<I/DEBUG  (31): signal11(SIGSEGV), fault addr0d9f00d8I/DEBUG  (31):  r00000af88  r10000a008  r2 baadf00d  r30d9f00d8I/DEBUG  (31):  r400000004r50000a008  r60000af88  r700013c44I/DEBUG  (31):  r800000000r9000000001000000000fp00000000I/DEBUG  (31):  ip0000959c  sp be956cc8  lr00008403pc0000841e  cpsr60000030I/DEBUG  (31):#00pc0000841e  /data/local/ndk-tests/crasherI/DEBUG  (31):#01pc000083fe  /data/local/ndk-tests/crasherI/DEBUG  (31):#02pc000083f6  /data/local/ndk-tests/crasherI/DEBUG  (31):#03pc000191ac  /system/lib/libc.soI/DEBUG  (31):#04pc000083ea  /data/local/ndk-tests/crasherI/DEBUG  (31):#05pc00008458/data/local/ndk-tests/crasherI/DEBUG  (31):#06pc0000d362  /system/lib/libc.so

转换为带文件名、函数名和行号的log:

**********Crash dump:**********Build fingerprint:'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'pid:351, tid:351>>>/data/local/ndk-tests/crasher<<<signal11(SIGSEGV), fault addr0d9f00d8Stackframe#00pc0000841e  /data/local/ndk-tests/crasher : Routine zooin/tmp/foo/crasher/jni/zoo.c:13Stackframe#01pc000083fe  /data/local/ndk-tests/crasher : Routine barin/tmp/foo/crasher/jni/bar.c:5Stackframe#02pc000083f6  /data/local/ndk-tests/crasher : Routine my_comparisonin/tmp/foo/crasher/jni/foo.c:9Stackframe#03pc000191ac  /system/lib/libc.soStackframe#04pc000083ea  /data/local/ndk-tests/crasher : Routine fooin/tmp/foo/crasher/jni/foo.c:14Stackframe#05pc00008458/data/local/ndk-tests/crasher : Routine mainin/tmp/foo/crasher/jni/main.c:19Stackframe#06pc0000d362  /system/lib/libc.so

用法

若要使用 ndk-stack,首先,需要一个包含应用共享库的符号版本。 如果使用 NDK 构建系统 (ndk-build),则这些共享库文件位于 $PROJECT_PATH/obj/local/ 下,其中 表示您的设备的 ABI。 默认情况下,系统使用 armeabi ABI。

可通过两种方式使用此工具。可以将 logcat 文本作为直接输入发送到程序。例如:

adb logcat|$NDK/ndk-stack-sym$PROJECT_PATH/obj/local/armeabi

也可以使用 -dump 选项将 logcat 指定为输入文件。例如:

adb logcat>/tmp/foo.txt$NDK/ndk-stack-sym$PROJECT_PATH/obj/local/armeabi-dumpfoo.txt

该工具在开始解析 logcat 输出时将查找第一行星号。例如:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

注:在复制/粘贴log时,请别忘了此行,否则 ndk-stack 无法正常工作。

系统库路径

out/target/product/ac8x_car/symbols/system/lib64/libatcmultimedia.so

在symbols中的库带有编译时的源码,需要注意的是,拷贝的so需要和问题的so为同一代码版本,否则定位出错或不准。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • http://www.baidu.com/sqlmap/mysql/test.php?id=1 当给sqlmap这...
    Gundy_阅读 4,615评论 0 0
  • sqlmap用户手册 说明:本文为转载,对原文中一些明显的拼写错误进行修正,并标注对自己有用的信息。 ======...
    wind_飘阅读 6,399评论 0 5
  • http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 当给sq...
    xuningbo阅读 13,541评论 2 22
  • 1.什么是tombstone当一个动态库(native 程序)开始执行时,系统会注册一些连接到 debuggerd...
    小裁缝在海边走着阅读 7,801评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,188评论 19 139

友情链接更多精彩内容