在通常的C/C++代码中,可以通过响应对内存操作不当引起的Segmentation Fault错误即信号SIGSEGV(11)做出响应处理。只要在程序中设置SIGSEGV的handler中,调用libc的backtrace,打出对应的堆栈信息,很快就能找到问题所在。但在Android中,bionic并不提供类似功能,而且log信息是走的logger,通过logcat才可以看到。但是android也会输出log信息,象下面这样:

view plain copy to clipboard print ?
  1. 02-0810:36:32.076:INFO/DEBUG(1261):pid:1959,tid:1959>>>android.radio<<<
  2. 02-0810:36:32.076:INFO/DEBUG(1261):signal11(SIGSEGV),faultaddr00198080
  3. 02-0810:36:32.076:INFO/DEBUG(1261):r000198080r181116dacr2ffffffear300000000
  4. 02-0810:36:32.086:INFO/DEBUG(1261):r48111a9f0r50000000ar600000888r70000000a
  5. 02-0810:36:32.086:INFO/DEBUG(1261):r8735f6d66r9525f6474104104bcd8fp00000000
  6. 02-0810:36:32.086:INFO/DEBUG(1261):ipa0000000spbec1a300lr81112561pc81109124cpsr80010010
  7. 02-0810:36:32.306:INFO/DEBUG(1261):#00pc00009124/system/lib/libfmradio_jni.so
  8. 02-0810:36:32.306:INFO/DEBUG(1261):#01pc0001255c/system/lib/libfmradio_jni.so
  9. 02-0810:36:32.306:INFO/DEBUG(1261):#02pc0000c93e/system/lib/libfmradio_jni.so
  10. 02-0810:36:32.316:INFO/DEBUG(1261):#03pc0000ae14/system/lib/libfmradio_jni.so
  11. 02-0810:36:32.316:INFO/DEBUG(1261):#04pc00008a72/system/lib/libfmradio_jni.so
  12. 02-0810:36:32.316:INFO/DEBUG(1261):#05pc00006c22/system/lib/libfmradio_jni.so
  13. 02-0810:36:32.326:INFO/DEBUG(1261):#06pc00004d92/system/lib/libfmradio_jni.so
  14. 02-0810:36:32.326:INFO/DEBUG(1261):#07pc0000e434/system/lib/libdvm.so

二进制代码置于手机中,处于size的考虑,剔除了符合信息。但我们可以使用编译时生成的二进制文件,获取其符号信息,从而得到调用堆栈:

view plain copy to clipboard print ?
  1. 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
  2. non_congruent
  3. bionic/libc/arch-arm/bionic/memcpy.S:229
  4. __sfvwrite
  5. bionic/libc/stdio/fvwrite.c:151
  6. __sprint
  7. bionic/libc/stdio/vfprintf.c:71
  8. printf
  9. bionic/libc/stdio/printf.c:44
  10. fm_std_Power
  11. frameworks/base/fmradio/jni/../../../../external/.../fmradio/fmapi/fm_std_api.c:144
  12. _Z11fm_SwitchOnv
  13. frameworks/base/fmradio/jni/fm_functions.cpp:95
  14. radio_SwitchOn
  15. frameworks/base/fmradio/jni/native.cpp:41
  16. yang@ubuntu$c++filt_Z11fm_SwitchOnv
  17. fm_SwitchOn()

于是通过这种方式,即可得到调用堆栈信息,找出问题所在。

Tags:

Android调用堆栈跟踪,Android调用堆栈解析,Android打印调用堆栈,Android Native C调用堆栈

原文:Android中Native代码SIGSEGV调试--调用堆栈解析

出自:http://blog.csdn.net/liangshengyang/archive/2010/09/21/5900083.aspx,作者:liangshengyang


更多相关文章

  1. 使用Kotlin:让Android与JS交互的详解
  2. Android实现系统关机和重启
  3. Android: AIDL --- Android中的远程接口
  4. Android(安卓)Content Provider
  5. Android和js进行交互
  6. Android调用系统关机与重启功能
  7. Linux Kernel and Android(安卓)休眠与唤醒(中文版)
  8. 浅析 Android(安卓)的窗口
  9. Android中的横竖屏

随机推荐

  1. Android开发中如何定义和使用数组
  2. Failed to install the following Androi
  3. Android 最火快速开发框架AndroidAnnotat
  4. Android(安卓)adb shell启动应用程序的方
  5. Sqlite在Android上的一个Bug - 临时文件
  6. android 中targetSdkVersion和与target属
  7. Android 我的 Android Studio 配置文件
  8. android 嵌入服务端页面二 之WebView与页
  9. android 定义手势
  10. PC通过USB连接Android通信(Socket)