Android调试.so库常用工具

转载 2013年12月03日 12:50:17

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Administrator@tgdn-3288 /cygdrive/d/cygwin/bin
$ ls | egrep "addr2line"
addr2line.exe*
i686-pc-mingw32-addr2line.exe*
i686-w64-mingw32-addr2line.exe*
x86_64-w64-mingw32-addr2line.exe*

Administrator@tgdn-3288 /cygdrive/d/cygwin/bin
$ x86_64-w64-mingw32-addr2line.exe -f -e /cygdrive/z/gt-project/gt-framwork/qcom8974/LNX.LA.3.2-02550-8x74.0-v1/out/target/product/msm8974/symbols/system/lib/hw/audio.primary.msm8974.so /cygdrive/z/gt-project/gt-framwork/qcom8974/LNX.LA.3.2-02550-8x74.0-v1/out/target/product/msm8974/system/lib/hw/audio.primary.msm8974.so 0001ae9c
??
??:0
_ZN20android_audio_legacy13ALSAStreamOps5closeEv
/opt2/shiyanhua/gt-project/gt-framwork/qcom8974/LNX.LA.3.2-02550-8x74.0-v1/hardware/qcom/audio/alsa_sound/ALSAStreamOps.cpp:537

Administrator@tgdn-3288 /cygdrive/d/cygwin/bin
$ x86_64-w64-mingw32-addr2line.exe -f -e /cygdrive/z/gt-project/gt-framwork/qcom8974/LNX.LA.3.2-02550-8x74.0-v1/out/target/product/msm8974/symbols/system/lib/hw/audio.primary.msm8974.so 0001ae9c                                                                                                                        _ZN20android_audio_legacy13ALSAStreamOps5closeEv
/opt2/shiyanhua/gt-project/gt-framwork/qcom8974/LNX.LA.3.2-02550-8x74.0-v1/hardware/qcom/audio/alsa_sound/ALSAStreamOps.cpp:537

Administrator@tgdn-3288 /cygdrive/d/cygwin/bin
$ addr2line.exe -f -e /cygdrive/z/gt-project/gt-framwork/qcom8974/LNX.LA.3.2-02550-8x74.0-v1/out/target/product/msm8974/symbols/system/lib/hw/audio.primary.msm8974.so 0001ae9c
_ZN20android_audio_legacy13ALSAStreamOps5closeEv
/opt2/shiyanhua/gt-project/gt-framwork/qcom8974/LNX.LA.3.2-02550-8x74.0-v1/hardware/qcom/audio/alsa_sound/ALSAStreamOps.cpp:537

Administrator@tgdn-3288 /cygdrive/d/cygwin/bin
$ addr2line.exe -f -e /cygdrive/z/gt-project/gt-framwork/qcom8974/LNX.LA.3.2-02550-8x74.0-v1/out/target/product/msm8974/symbols/system/lib/hw/audio.primary.msm8974.so 00010198
_ZN20android_audio_legacy17AudioHardwareALSA15openInputStreamEjPiPjS2_S1_NS_11AudioSystem18audio_in_acousticsE
/opt2/shiyanhua/gt-project/gt-framwork/qcom8974/LNX.LA.3.2-02550-8x74.0-v1/hardware/qcom/audio/alsa_sound/AudioHardwareALSA.cpp:2266

Administrator@tgdn-3288 /cygdrive/d/cygwin/bin
$ addr2line.exe -f -e /cygdrive/f/symbol/symbols/system/lib/hw/audio.primary.msm8974.so 00010198
_ZN20android_audio_legacy17AudioHardwareALSA15openInputStreamEjPiPjS2_S1_NS_11AudioSystem18audio_in_acousticsE
/home/compiler/workspace/gphone/MSM8974AB/PD1303A/LNX.LA.3.2-07850-8x74.0-trunk-eng/hardware/qcom/audio/alsa_sound/AudioHardwareALSA.cpp:2386
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
android 调试中 addr2line 命令的使用

关于调试:调试中addr2line命令的使用。
问题引出:i850的wifi定位开启后,在使用goole maps时出现rootfs重启现象,打印的log信息如下:
//////////////////////////
I/DEBUG   ( 3411): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   ( 3411): Build fingerprint: 'PROWAVE/i850/i850/:Eclair/ECLAIR/eng.zhangjiejing.20100430.113200:eng/test-keys'
I/DEBUG   ( 3411): pid: 3436, tid: 3475  >>> system_server <<<
I/DEBUG   ( 3411): signal 11 (SIGSEGV), fault addr 00000000
I/DEBUG   ( 3411):  r0 26ba7eec  r1 403f3c49  r2 e98cf6f4  r3 405e58ae
I/DEBUG   ( 3411):  r4 00000000  r5 00000000  r6 4229b6cc  r7 48fecec8
I/DEBUG   ( 3411):  r8 490ecd84  r9 48feceb4  10 48fece9c  fp 00314d30
I/DEBUG   ( 3411):  ip ad3527cd  sp 490ecd68  lr ad3527eb  pc 00000000  cpsr 00000010
I//system/bin/dhcpcd( 3673): wlan0: looping
I//system/bin/dhcpcd( 3673): wlan0: signal_fd: 4,fd:5
I/ActivityManager( 3436): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.android.launcher/.Launcher }
D/LocationManager( 3777): removeUpdates: listener = P.a@43da64b8
I/DEBUG   ( 3411):          #00  pc 00000000  
I/DEBUG   ( 3411):          #01  pc 000527e8  /system/lib/libandroid_runtime.so
I/DEBUG   ( 3411):          #02  pc 0000f1f4  /system/lib/libdvm.so

I/DEBUG   ( 3411):
I/DEBUG   ( 3411): code around lr:
I/DEBUG   ( 3411): ad3527d8 69e19806 694c9000 1c191c10 9b059a04
I/DEBUG   ( 3411): ad3527e8 b00247a0 46c0bd10 00017868 00006728
I/DEBUG   ( 3411): ad3527f8 4c0fb570 447c4d0f 6b2e1965 d1112e00
I/DEBUG   ( 3411):
I/DEBUG   ( 3411): stack:
I/DEBUG   ( 3411):     490ecd28  00000013  
I/DEBUG   ( 3411):     490ecd2c  ad05f661  /system/lib/libdvm.so
I/DEBUG   ( 3411):     490ecd30  410c2aec  /dalvik-LinearAlloc (deleted)
I/DEBUG   ( 3411):     490ecd34  ad0560f7  /system/lib/libdvm.so
I/DEBUG   ( 3411):     490ecd38  400292d8  /mspace/dalvik-heap/zygote/0 (deleted)
I/DEBUG   ( 3411):     490ecd3c  410c2aec  /dalvik-LinearAlloc (deleted)
I/DEBUG   ( 3411):     490ecd40  000003dc  
I/DEBUG   ( 3411):     490ecd44  ad0591f5  /system/lib/libdvm.so
I/DEBUG   ( 3411):     490ecd48  42200d44  /data/dalvik-cache/system@@classes.dex
I/DEBUG   ( 3411):     490ecd4c  42200d44  /data/dalvik-cache/system@@classes.dex
I/DEBUG   ( 3411):     490ecd50  4232b87d  /data/dalvik-cache/system@@classes.dex
I/DEBUG   ( 3411):     490ecd54  00000000  
I/DEBUG   ( 3411):     490ecd58  4264aa04  /data/dalvik-cache/system@@classes.dex
I/DEBUG   ( 3411):     490ecd5c  410c1cbc  /dalvik-LinearAlloc (deleted)
I/DEBUG   ( 3411):     490ecd60  df002777  
I/DEBUG   ( 3411):     490ecd64  e3a070ad  
I/DEBUG   ( 3411): #01 490ecd68  43160000  
I/DEBUG   ( 3411):     490ecd6c  ad05f661  /system/lib/libdvm.so
I/DEBUG   ( 3411):     490ecd70  490ecda8  
I/DEBUG   ( 3411):     490ecd74  ad00f1f8  /system/lib/libdvm.so
W/ActivityManager( 3436): Activity pause timeout for HistoryRecord{43d6cd48 com.google.android.apps.maps/com.google.android.maps.MapsActivity}
wait for fb sleep Enter
D/WifiService( 3436): releaseWifiLockLocked: WifiLock{NetworkLocationProvider type=2 binder=android.os.Binder@43bfb998}
binder: release 3436:3560 transaction 22233 in, still active
binder: send failed reply for transaction 22233 to 3777:3777
I/DEBUG   ( 3411): debuggerd committing suicide to free the zombie!
I/DEBUG   ( 3855): debuggerd: Apr 14 2010 14:24:22
I/ServiceManager( 2066): service 'usagestats' died
I/ServiceManager( 2066): service 'account' died
//////////////////////////
注意到红色部分,这就是程序执 行时的栈!显然第一个pc指针的值为0,也就是pc指针为空,这就是问题之所在,接 下来就是要定位这个问题,上边说了,这里是程序执行时的栈,那么#01  pc 000527e8  /system/lib/libandroid_runtime.so   这个地址就是我们要找的问题的范围,因为显然是后者先入栈的,所以显然前者包含于后者,那么通过如下命令用地址定位一下源码的位置:
cpp@cpp:~/r7_0422$ ../gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-addr2line -e out/target/product/i850/symbols/system/lib/libandroid_runtime.so 000527e8
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp:397
cpp@cpp:~/r7_0422$


看到源码的397行是一个函数,那么000527e8就是这个函数的入 口地址了。继而,pc 000000 对应的调用就应该在该函数内部,看到该函数内部只是做了对另一个函数指针的调用而已,所以我们可以断定这个函数指针的值为空,显然调用一个空的指针函数是 错误的。所以需要给这个函数指针在早些时候赋值一下问题就可以解决了!


关于addr2line的一点补充: 如果可执行文件中没有包括调试符号,您将获得??:0 作为响应。  还有在linux中的readelf命令可以读取可执行文件的相关信息,比如有一个可执行文件 aa.elf  则可以这么使用: readelf    -h      aa.elf 参数-h读取可执行文件的head信息。  
参考连接:http://www.xxlinux.com/linux/article/accidence/technique/20070125/7209.html

http://blog.csdn.net/yasin_lee/article/details/5700348

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

readelf

显示目标ELF文件的信息,比如信赖库,头信息,段信息等。

addr2line

用户进程崩溃时内核会记录一些基本的调试信息,如果进程执行的ELF文件包含调试符号,就可以通过addr2line找到源文件中哪一行出问题。我在调试Android的VM崩溃问题时使用到了这个工具(详细过程参考这里http://blog.csdn.net/a345017062/archive/2011/05/04/6394864.aspx)

nm

列出目标文件的符号清单,当没有输入文件名时,默认为a.out。

size

显示一个目标文件或者链接库文件中的目标文件的各个段的大小,当没有输入文件名时,默认为a.out。

objdump

它主要是查看ELF目标文件的内容信息

ranlib

对静态库的符号索引表进行更新

strip

通过除去绑定程序和符号调试程序使用的信息,减少扩展公共对象文件格式(XCOFF)的对象文件的大小

gprof

可以显示程序运行的“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间。也可以显示“调用图”,包括函数的调用关系,每个函数调用花费了多少时间。

strings

列出文件中的可打印字符串

 

gprof使用介绍

http://hi.baidu.com/juventus/blog/item/312dd42a0faf169b033bf6ff.html

strip 命令

http://blog.csdn.net/aaronychen/archive/2008/03/18/2193735.aspx

ranlib的用法

http://blog.csdn.net/cmiaomiaozoo/archive/2009/10/28/4738910.aspx

linux 下使用 objdump 反汇编

http://blog.csdn.net/nwf5d/archive/2009/08/07/4423591.aspx

readelf命令

http://blog.csdn.net/zyp2671/archive/2010/04/02/5443770.aspx

nm命令介绍

http://blog.csdn.net/breezef/archive/2006/08/12/1054475.aspx

size 命令的用法

http://blog.csdn.net/clozxy/archive/2010/06/02/5641785.aspx

android 调试中 addr2line 命令的使用

http://blog.csdn.net/coder_jack/archive/2010/06/28/5700348.aspx

linux debug : addr2line追踪出错地址

http://blog.csdn.net/epicyong333/archive/2009/05/13/4178011.aspx

ldd 显示可执行模块的dependency

http://blog.csdn.net/chinalinuxzend/archive/2008/09/05/2887981.aspx

http://blog.csdn.net/a345017062/article/details/6397759

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Android下用GDB调试.so的方法

Android下开发程序我一
  • v6543210
  • v6543210
  • 2014年04月30日 17:30
  • 1736

Android 下调试SO文件

1.    修改AndroidManifest.xml:          android:debuggable="true"    2.    以调试等待的模式启动apk:         ...
  • yy405145590
  • yy405145590
  • 2014年11月12日 10:35
  • 939

Android Studio如何Debug对应so文件C/C++代码

在C/C++跨平台开发中,我们知道在Windows上可以通过VS,进行单步断点调试,这非常方便。但是我们如果编译好的动态库so,想要跟踪下其流程及各个阶段,如,怎么跟踪FFmpeg/VLC等库内部de...
  • Ch97CKd
  • Ch97CKd
  • 2017年12月06日 00:00
  • 220

android 生成的.so 调试方法

readelf 显示目标ELF文件的信息,比如信赖库,头信息,段信息等。 addr2line 用户进程崩溃时内核会记录一些基本的调试信息,如果进程执行的ELF文件包含调试符号,就可以通过addr...
  • prike
  • prike
  • 2015年12月04日 09:19
  • 483

一种另类的so库调试方法

最近搞某平台的影视软件登录算法,遇到瓶颈,因为一个参数会在so层获取一个参数,虽然用ida逆向出了c++代码,但是因为太菜,只看出了个大概的东西,细节上看不太懂,能猜出从so库取出的值是固定的,(这是...
  • u012833250
  • u012833250
  • 2016年12月08日 00:41
  • 417

android 使用eclipse 调试 so

Eclipse+CDT+GDB调试android NDK程序 Eclipse+CDT+gdb调试android ndk程序 先介绍一下开发环境,在这个环境下,up主保证是没有问...
  • chenghai2011
  • chenghai2011
  • 2012年05月24日 10:18
  • 7151

Android 静态和动态的调用so库(JNI)

转载请标明出处: http://blog.csdn.net/djy1992/article/details/78890252 本文出自:【奥特曼超人的博客】 静态编译不再多说,可以查看这篇...
  • DJY1992
  • DJY1992
  • 2017年12月25日 10:51
  • 7878

Android IDA So的动态调试大法

今天已是国庆的第五天,白天去武馆训练过后,晚上回来品一杯龙湖西井,更一篇博客,一来帮助需要之人,二来加深自己的理解。 下面就说关于在IDA中Android so的动态调试的问题以及在so的三个层次下断...
  • feibabeibei_beibei
  • feibabeibei_beibei
  • 2016年10月05日 19:48
  • 11924

关于android,so库那点事~~

Android 应用开发中不可避免的会引入第三方的代码。如果是开源项目风险相对可控,如果引入商用的 SDK 那就要谨慎了,难免会有这样或那样的问题。比如我们今天要说的这一个。 对集成过第三方 SDK ...
  • lx448593jp
  • lx448593jp
  • 2016年07月04日 11:45
  • 1600

android so库 堆栈错误查看

前面修改mars的数据发送,重新编译后 启动app发现堆栈错误可以使用如下命令找到出错的地方adb logcat | ndk-stack -sym  F:\code\android\mars\mars...
  • new_abc
  • new_abc
  • 2017年01月25日 11:45
  • 728
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android调试.so库常用工具
举报原因:
原因补充:

(最多只允许输入30个字)