Android调用堆栈跟踪
16lz
2021-01-23
在通常的C/C++代码中,可以通过响应对内存操作不当引起的Segmentation Fault错误即信号SIGSEGV(11)做出响应处理。只要在程序中设置SIGSEGV的handler中,调用libc的backtrace,打出对应的堆栈信息,很快就能找到问题所在。但在Android中,bionic并不提供类似功能,而且log信息是走的logger,通过logcat才可以看到。但是android也会输出log信息,象下面这样:
view plain copy to clipboard print ?- 02-0810:36:32.076:INFO/DEBUG(1261):pid:1959,tid:1959>>>android.radio<<<
- 02-0810:36:32.076:INFO/DEBUG(1261):signal11(SIGSEGV),faultaddr00198080
- 02-0810:36:32.076:INFO/DEBUG(1261):r000198080r181116dacr2ffffffear300000000
- 02-0810:36:32.086:INFO/DEBUG(1261):r48111a9f0r50000000ar600000888r70000000a
- 02-0810:36:32.086:INFO/DEBUG(1261):r8735f6d66r9525f6474104104bcd8fp00000000
- 02-0810:36:32.086:INFO/DEBUG(1261):ipa0000000spbec1a300lr81112561pc81109124cpsr80010010
- 02-0810:36:32.306:INFO/DEBUG(1261):#00pc00009124/system/lib/libfmradio_jni.so
- 02-0810:36:32.306:INFO/DEBUG(1261):#01pc0001255c/system/lib/libfmradio_jni.so
- 02-0810:36:32.306:INFO/DEBUG(1261):#02pc0000c93e/system/lib/libfmradio_jni.so
- 02-0810:36:32.316:INFO/DEBUG(1261):#03pc0000ae14/system/lib/libfmradio_jni.so
- 02-0810:36:32.316:INFO/DEBUG(1261):#04pc00008a72/system/lib/libfmradio_jni.so
- 02-0810:36:32.316:INFO/DEBUG(1261):#05pc00006c22/system/lib/libfmradio_jni.so
- 02-0810:36:32.326:INFO/DEBUG(1261):#06pc00004d92/system/lib/libfmradio_jni.so
- 02-0810:36:32.326:INFO/DEBUG(1261):#07pc0000e434/system/lib/libdvm.so
二进制代码置于手机中,处于size的考虑,剔除了符合信息。但我们可以使用编译时生成的二进制文件,获取其符号信息,从而得到调用堆栈:
view plain copy to clipboard print ?
- yang@ubuntu$src/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-addr2line-f-esrc/out/target/product/pnx6715_refd/symbols/system/lib/libfmradio_jni.so0000960c000129ec0000cdce0000b2a40000949600008258000054f6
- non_congruent
- bionic/libc/arch-arm/bionic/memcpy.S:229
- __sfvwrite
- bionic/libc/stdio/fvwrite.c:151
- __sprint
- bionic/libc/stdio/vfprintf.c:71
- printf
- bionic/libc/stdio/printf.c:44
- fm_std_Power
- frameworks/base/fmradio/jni/../../../../external/.../fmradio/fmapi/fm_std_api.c:144
- _Z11fm_SwitchOnv
- frameworks/base/fmradio/jni/fm_functions.cpp:95
- radio_SwitchOn
- frameworks/base/fmradio/jni/native.cpp:41
- yang@ubuntu$c++filt_Z11fm_SwitchOnv
- fm_SwitchOn()
于是通过这种方式,即可得到调用堆栈信息,找出问题所在。
Tags:
Android调用堆栈跟踪,Android调用堆栈解析,Android打印调用堆栈,Android Native C调用堆栈
原文:Android中Native代码SIGSEGV调试--调用堆栈解析
出自:http://blog.csdn.net/liangshengyang/archive/2010/09/21/5900083.aspx,作者:liangshengyang
更多相关文章
- 在Android中用纯Java代码布局
- 使用Android Studio调试Android Framework代码
- Linux手机打电话代码分析
- Android软件广告屏蔽方法及代码
- Android studio使用技巧(二:国际化以及代码重构)
- Android的SocketTCP客户端发送信息