如何分析U-APM的Android Native堆栈
如下内容为一次崩溃的部分堆栈内容,及内容分析
以函数调用堆栈首行为例:
#00 pc 000000000001055c /data/app/~~u9oYfR7XE9OzFkiHqK04OA==/com.apm.demo-YKFC0lGO711brxw-AGQutA==/lib/arm64/libTestCore-lib.so (test()+224)#00:堆栈序号
pc 000000000001055c:崩溃发生时程序计数器位于 libTestCore-lib.so 偏移 0x1055c 处
test()+224:0x1055c偏移处对应着test()函数偏移224的一条指令
#01 pc 000000000000106c /data/app/~~u9oYfR7XE9OzFkiHqK04OA==/com.apm.demo-YKFC0lGO711brxw-AGQutA==/lib/arm64/libTest-lib.so (Java_com_native_crashtest+64)上文为第二层堆栈,表示在离 libTest-lib.so 0x106c(即Java_com_native_crashtest+64)位置的指令发生了一次函数调用,产生了第一层堆栈。
在上述堆栈中,只能大概定位到崩溃发生所在的so文件及对应的函数,但无法准确找到崩溃发生所在行数,因此需要借助符号表来进行解析。
在后台上传对应符号表后,重新解析崩溃堆栈,可以得到如下内容:
fpsr 00000011 fpcr 00000000#00 pc 000000000000f320 libTestCore-lib.so::test() at testcore.cpp:28#01 pc 0000000000001008 libTest-lib.so::Java_com_native_crashtest at test.cpp:22#02 pc 00000000000d7644 /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+148)#03 pc 0000000000009188 /apex/com.android.art/lib64/libart.so (nterp_helper+152)#04 pc 000000000000a044 /apex/com.android.art/lib64/libart.so (nterp_helper+3924)#05 pc 000000000036bfb0 /system/framework/arm64/boot-framework.oat
--- --- --- ---通过符号表,可以将堆栈内容准确转换为对应的代码文件名称和堆栈调用所在行数。
强烈建议,每次正式包上线前,务必将对应的符号表配置到APM后台。