Android调用堆栈跟踪

在通常的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-08 10:36:32.076: INFO/DEBUG(1261): pid: 1959, tid: 1959  >>> android.radio <<<  
  2. 02-08 10:36:32.076: INFO/DEBUG(1261): signal 11 (SIGSEGV), fault addr 00198080  
  3. 02-08 10:36:32.076: INFO/DEBUG(1261):  r0 00198080  r1 81116dac  r2 ffffffea  r3 00000000  
  4. 02-08 10:36:32.086: INFO/DEBUG(1261):  r4 8111a9f0  r5 0000000a  r6 00000888  r7 0000000a  
  5. 02-08 10:36:32.086: INFO/DEBUG(1261):  r8 735f6d66  r9 525f6474  10 4104bcd8  fp 00000000  
  6. 02-08 10:36:32.086: INFO/DEBUG(1261):  ip a0000000  sp bec1a300  lr 81112561  pc 81109124  cpsr 80010010  
  7. 02-08 10:36:32.306: INFO/DEBUG(1261):          #00  pc 00009124  /system/lib/libfmradio_jni.so  
  8. 02-08 10:36:32.306: INFO/DEBUG(1261):          #01  pc 0001255c  /system/lib/libfmradio_jni.so  
  9. 02-08 10:36:32.306: INFO/DEBUG(1261):          #02  pc 0000c93e  /system/lib/libfmradio_jni.so  
  10. 02-08 10:36:32.316: INFO/DEBUG(1261):          #03  pc 0000ae14  /system/lib/libfmradio_jni.so  
  11. 02-08 10:36:32.316: INFO/DEBUG(1261):          #04  pc 00008a72  /system/lib/libfmradio_jni.so  
  12. 02-08 10:36:32.316: INFO/DEBUG(1261):          #05  pc 00006c22  /system/lib/libfmradio_jni.so  
  13. 02-08 10:36:32.326: INFO/DEBUG(1261):          #06  pc 00004d92  /system/lib/libfmradio_jni.so  
  14. 02-08 10:36:32.326: INFO/DEBUG(1261):          #07  pc 0000e434  /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 -e src/out/target/product/pnx6715_refd/symbols/system/lib/libfmradio_jni.so 0000960c 000129ec 0000cdce 0000b2a4 00009496 00008258 000054f6  
  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


你可能感兴趣的:(android,ubuntu,手机,tags,Signal)