在通常的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. 在Android中用纯Java代码布局
  2. 使用Android Studio调试Android Framework代码
  3. Linux手机打电话代码分析
  4. Android软件广告屏蔽方法及代码
  5. Android studio使用技巧(二:国际化以及代码重构)
  6. Android的SocketTCP客户端发送信息

随机推荐

  1. 带有无线电的JavaScript条件字段不起作用
  2. Sails.js套接字。好的和坏的一面。与sock
  3. JavaScript学习笔记:你必须要懂的原生JS(一
  4. IE下javascript cookie path设置Bug
  5. Javascript正则表达式应该允许空和非空字
  6. 我所理解的jQuery(2)--谈jQuery的整体设
  7. JS闭包学习笔记(2):循环和闭包
  8. 类似jQuery的extend扩展方法的实现
  9. Json返回[object object]而不是array
  10. JavaScript声明全局变量三种方式的异同