反組譯碼調試Android

來源:互聯網
上載者:User

標籤:des   android   style   blog   http   color   io   ar   for   

https://code.google.com/p/android/issues/detail?id=73076

 

http://my.unix-center.net/~Simon_fu/?p=527

 

在移植Android過程中會遇到很多Crash的情況,尤其是啟動Android過程中。一般這些問題都可以通過看代碼能解決,當然也有一些比較“妖嬈”的問題,非常難找到頭緒,在logcat日誌也只會列印一些崩潰的堆棧,這些資訊很難協助我們定位問題。根據個人一個執行個體來介紹一下在Android移植過程中反組譯碼的用法。

     首先先看一下我遇到的一個logcat關於Crash的列印資訊:

I/DEBUG   ( 1417): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***I/DEBUG   ( 1417): Build fingerprint: ‘generic/sdk/generic/:Eclair/ECLAIR/eng.simon.20100607.133011:eng/test-keys‘I/DEBUG   ( 1417): pid: 1434, tid: 1460  >>> system_server <<<I/DEBUG   ( 1417): signal 11 (SIGSEGV), fault addr 00000000I/DEBUG   ( 1417):  zr 00000000  at 00000000  v0 00007265  v1 00193228I/DEBUG   ( 1417):  a0 00000001  a1 0000000a  a2 00193228  a3 001f2ccfI/DEBUG   ( 1417):  t0 00193228  t1 80000008  t2 8007e8dc  t3 fffffff8I/DEBUG   ( 1417):  t4 00030465  t5 00000000  t6 00200073  t7 00000000I/DEBUG   ( 1417):  s0 2fa0786c  s1 30564f00  s2 7ef5d990  s3 2fa0786cI/DEBUG   ( 1417):  s4 30465000  s5 00100000  s6 7b10a8b4  s7 00000001I/DEBUG   ( 1417):  t8 00000000  t9 7ef50d44  k0 00000000  k1 00000000I/DEBUG   ( 1417):  gp 7ef6fd60  sp 30564e90  s8 2fa07858  ra 7ef53470I/DEBUG   ( 1417):  hi 0000000f  lo 04444444 bva 00007265 epc 7ef534a4I/DEBUG   ( 1417):          #00  pc 7ef534a4  /system/lib/libc.soI/DEBUG   ( 1417):          #01  ra 7ef53470  /system/lib/libc.soI/DEBUG   ( 1417):I/DEBUG   ( 1417): code around pc:I/DEBUG   ( 1417): 7ef53494 afa7002c afa40030 1040000b afa50028I/DEBUG   ( 1417): 7ef534a4 8c4a0000 8c440008 8c590004 8fa2001cI/DEBUG   ( 1417): 7ef534b4 0320f809 ac4a0034 8fa9001c 8d220034I/DEBUG   ( 1417):I/DEBUG   ( 1417): code around lr:I/DEBUG   ( 1417): 7ef53460 afbc0010 8f9987c4 0320f809 00808021I/DEBUG   ( 1417): 7ef53470 afa2001c 8fa8001c 8fa6001c 8fa3001cI/DEBUG   ( 1417): 7ef53480 8d07000c 8cc40010 8c650008 8c420034I/DEBUG   ( 1417):I/DEBUG   ( 1417): stack:I/DEBUG   ( 1417):     30564e50  00000000I/DEBUG   ( 1417):     30564e54  00000000I/DEBUG   ( 1417):     30564e58  00000000I/DEBUG   ( 1417):     30564e5c  00000000I/DEBUG   ( 1417):     30564e60  00009004I/DEBUG   ( 1417):     30564e64  00000000I/DEBUG   ( 1417):     30564e68  00000000I/DEBUG   ( 1417):     30564e6c  00000000I/DEBUG   ( 1417):     30564e70  00000009I/DEBUG   ( 1417):     30564e74  00000000I/DEBUG   ( 1417):     30564e78  00000000I/DEBUG   ( 1417):     30564e7c  7ef12af4  /system/lib/libc.soI/DEBUG   ( 1417):     30564e80  7ef6fd60I/DEBUG   ( 1417):     30564e84  00000000I/DEBUG   ( 1417):     30564e88  00000000I/DEBUG   ( 1417):     30564e8c  7ef53470  /system/lib/libc.soI/DEBUG   ( 1417):     30564e90  7ef6fd60I/DEBUG   ( 1417):     30564e94  00000000I/DEBUG   ( 1417):     30564e98  30564eb4I/DEBUG   ( 1417):     30564e9c  00000000I/DEBUG   ( 1417):     30564ea0  7ef6fd60I/DEBUG   ( 1417):     30564ea4  7b10a8e8  /system/lib/libsqlite.soI/DEBUG   ( 1417):     30564ea8  7b10a8b4  /system/lib/libsqlite.soI/DEBUG   ( 1417):     30564eac  00193228  [heap]I/DEBUG   ( 1417):     30564eb0  2fa07870I/DEBUG   ( 1417):     30564eb4  00000000I/DEBUG   ( 1417):     30564eb8  0000000aI/DEBUG   ( 1417):     30564ebc  001f2ccf  [heap]I/DEBUG   ( 1417):     30564ec0  00000001I/DEBUG   ( 1417):     30564ec4  7ef537fc  /system/lib/libc.soI/DEBUG   ( 1417):     30564ec8  00193228  [heap]I/DEBUG   ( 1417):     30564ecc  30564f00I/DEBUG   ( 1417):     30564ed0  7ef5d990  /system/lib/libc.soI/DEBUG   ( 1417):     30564ed4  2fa0786cI/DEBUG   ( 1417):     30564ed8  30465000I/DEBUG   ( 1417):     30564edc  00100000  [heap]I/DEBUG   ( 1417):     30564ee0  7b10a8b4  /system/lib/libsqlite.soI/DEBUG   ( 1417):     30564ee4  00000001I/DEBUG   ( 1417):     30564ee8  2fa07858I/DEBUG   ( 1417):     30564eec  7ef530ac  /system/lib/libc.soI/DEBUG   ( 1417):     30564ef0  7b10a8b4  /system/lib/libsqlite.soI/DEBUG   ( 1417):     30564ef4  2fa0786cI/DEBUG   ( 1417):     30564ef8  00000000I/DEBUG   ( 1417):     30564efc  00000000I/DEBUG   ( 1417):     30564f00  30564f00I/DEBUG   ( 1417):     30564f04  00193228  [heap]I/DEBUG   ( 1417):     30564f08  00000009I/DEBUG   ( 1417):     30564f0c  00000000I/DEBUG   ( 1417):     30564f10  00000000I/DEBUG   ( 1417):     30564f14  00000000I/DEBUG   ( 1417):     30564f18  00000000I/DEBUG   ( 1417):     30564f1c  00000000I/DEBUG   ( 1417):     30564f20  00000000I/DEBUG   ( 1417):     30564f24  00000000I/DEBUG   ( 1417):     30564f28  00000000I/DEBUG   ( 1417):     30564f2c  00000000I/DEBUG   ( 1417):     30564f30  00000000I/DEBUG   ( 1417):     30564f34  00000000I/DEBUG   ( 1417):     30564f38  00000000I/DEBUG   ( 1417):     30564f3c  00000000I/DEBUG   ( 1417):     30564f40  00000000I/DEBUG   ( 1417):     30564f44  00000000I/DEBUG   ( 1417):     30564f48  00000000I/DEBUG   ( 1417):     30564f4c  00000000I/DEBUG   ( 1417):     30564f50  00000000I/DEBUG   ( 1417):     30564f54  00000000I/DEBUG   ( 1417):     30564f58  00000000I/DEBUG   ( 1417):     30564f5c  00000000I/DEBUG   ( 1417):     30564f60  00000000I/DEBUG   ( 1417):     30564f64  00000000I/DEBUG   ( 1417):     30564f68  00000000I/DEBUG   ( 1417):     30564f6c  00000000I/DEBUG   ( 1417):     30564f70  00000000I/DEBUG   ( 1417):     30564f74  00000000I/DEBUG   ( 1417):     30564f78  00000000I/DEBUG   ( 1417):     30564f7c  00000000I/DEBUG   ( 1417):     30564f80  00000000I/DEBUG   ( 1417):     30564f84  00000000I/DEBUG   ( 1417):     30564f88  00000000I/DEBUG   ( 1417):     30564f8c  00000000I/DEBUG   ( 1417):     30564f90  00000000I/DEBUG   ( 1417):     30564f94  00000000I/DEBUG   ( 1417):     30564f98  00000000I/DEBUG   ( 1417):     30564f9c  00000000I/DEBUG   ( 1417):     30564fa0  00000000I/DEBUG   ( 1417):     30564fa4  00000000I/DEBUG   ( 1417):     30564fa8  00000000I/DEBUG   ( 1417):     30564fac  00000000I/DEBUG   ( 1417):     30564fb0  00000000I/DEBUG   ( 1417):     30564fb4  00000000I/DEBUG   ( 1417):     30564fb8  00000000I/DEBUG   ( 1417):     30564fbc  00000000I/DEBUG   ( 1417):     30564fc0  00000000I/DEBUG   ( 1417):     30564fc4  00000000I/DEBUG   ( 1417):     30564fc8  00000000I/DEBUG   ( 1417):     30564fcc  00000000I/DEBUG   ( 1417):     30564fd0  00000000I/DEBUG   ( 1417):     30564fd4  00000000I/DEBUG   ( 1417):     30564fd8  00000000I/DEBUG   ( 1417):     30564fdc  00000000I/DEBUG   ( 1417):     30564fe0  00000000I/DEBUG   ( 1417):     30564fe4  00000000I/DEBUG   ( 1417):     30564fe8  00000000I/DEBUG   ( 1417):     30564fec  00000000I/DEBUG   ( 1417):     30564ff0  00000000I/DEBUG   ( 1417):     30564ff4  00000000I/DEBUG   ( 1417):     30564ff8  00000000I/DEBUG   ( 1417):     30564ffc  00000000I/DEBUG   ( 1417):     30565000  00000000I/DEBUG   ( 1417):     30565004  00000000I/DEBUG   ( 1417):     30565008  00000000I/DEBUG   ( 1417):     3056500c  00000000I/DEBUG   ( 1417):     30565010  00000000I/DEBUG   ( 1417):     30565014  00000000I/DEBUG   ( 1417):     30565018  00000000I/DEBUG   ( 1417):     3056501c  00000000I/DEBUG   ( 1417):     30565020  00000000I/DEBUG   ( 1417):     30565024  00000000I/DEBUG   ( 1417):     30565028  00000000I/DEBUG   ( 1417):     3056502c  00000000I/DEBUG   ( 1417):     30565030  00000000I/DEBUG   ( 1417):     30565034  00000000I/DEBUG   ( 1417):     30565038  00000000I/DEBUG   ( 1417):     3056503c  00000000I/DEBUG   ( 1417):     30565040  00000000W/SyncManager( 1434): Updating for new accounts...

     通過這個log資訊我們可以看到libc.so崩潰了,再研究堆棧發現是libsqilte.so引起的,那麼具體是哪一個函數崩潰了呢?這裡面沒有資訊。另外核心載入動態庫是動態載入的,就算我們反組譯碼出來libc.so和libsqlite.so,符號表也沒有辦法和log中地址對應上,除非我們能知道核心載入libc.so和libsqlite.so的基地址,這樣我們就可以通過位移找到相應的函數了。很幸運,Android確實規定了系統中的大部分庫的核心載入地址。檔案的位置在build/core下,有對應平台的map檔案,比如:Arm平台檔案名稱叫做prelink-linux-arm.map,Mips平台叫做prelink-linux-mips.map。我是在Mips平台出的問題,所以應該用prelink-linux-mips.map檔案來定位。檔案內容如下:

# 0x7F100000 - 0x7FFF0000 Thread 0 stack# 0x7F000000 - 0x7F0FFFFF Linker# 0x70000000 - 0x7EFFFFFF Prelinked System Libraries# 0x60000000 - 0x6FFFFFFF Prelinked App Libraries# 0x50000000 - 0x5FFFFFFF Non-prelinked Libraries# 0x40000000 - 0x4FFFFFFF mmap‘d stuff# 0x10000000 - 0x3FFFFFFF Thread Stacks# 0x00080000 - 0x0FFFFFFF .text / .data / heap# core system librarieslibdl.so                0x7EFF0000libc.so                 0x7EF00000libstdc++.so            0x7EEF0000libm.so                 0x7EE90000liblog.so               0x7EE80000libcutils.so            0x7EE00000libthread_db.so         0x7ED80000libz.so                 0x7ED00000libevent.so             0x7EC80000libssl.so               0x7EC00000libcrypto.so            0x7EA00000libffi.so        0x7E980000libsysutils.so          0x7E900000# bluetoothliba2dp.so              0x7E780000audio.so                0x7E700000input.so                0x7E680000libhcid.so              0x7E600000libbluedroid.so         0x7E580000libbluetooth.so         0x7E500000libdbus.so              0x7E400000# extended system librarieslibril.so               0x7E300000libreference-ril.so     0x7E000000libwpa_client.so        0x7DC00000libnetutils.so          0x7DB00000# core dalvik runtime supportlibandroid_servers.so   0x7D900000#libicudata.so           0x7D700000libicuuc.so             0x7D500000libicui18n.so           0x7D380000libandroid_runtime.so   0x7D2a0000libnativehelper.so      0x7D200000libdvm-MIPS.so          0x7D180000libdvm.so               0x7D000000# graphicslibpixelflinger.so      0x7CF00000libsurfaceflinger.so    0x7CD00000libagl.so               0x7CC00000libGLESv1_CM.so         0x7CB00000libGLESv2.so            0x7CA00000libOpenVG_CM.so         0x7C900000libOpenVGU_CM.so        0x7C800000libEGL.so               0x7C700000libexif.so              0x7C500000libui.so                0x7C400000libsgl.so               0x7C000000# audiolibspeech.so            0x7BA00000libaudio.so             0x7B900000libsonivox.so           0x7B800000libsoundpool.so         0x7B700000libvorbisidec.so        0x7B600000libmedia_jni.so         0x7B500000libmediaplayerservice.so 0x7B480000libmedia.so             0x7B400000libFFTEm.so             0x7B300000libaudioflinger.so      0x7B200000# assorted system librarieslibsqlite.so            0x7B100000libexpat.so             0x7B000000libwebcore.so           0x7A000000libutils.so             0x79D00000libcameraservice.so     0x79C80000libhardware.so          0x79C70000libhardware_legacy.so   0x79C00000libapp_process.so       0x79B00000libsystem_server.so     0x79A00000libime.so               0x79800000libgps.so               0x79700000libcamera.so            0x79680000libqcamera.so           0x79400000# pv librarieslibpvasf.so                    0x79200000libpvasfreg.so                 0x79100000libomx_sharedlibrary.so        0x790e0000libopencore_download.so        0x79000000libopencore_downloadreg.so     0x78f00000libopencore_net_support.so     0x78e00000libopencore_rtsp.so            0x78d00000libopencore_rtspreg.so         0x78c00000libopencore_author.so          0x78a00000libomx_aacdec_sharedlibrary.so 0x789c0000libomx_amrdec_sharedlibrary.so 0x78990000libomx_amrenc_sharedlibrary.so 0x78970000libomx_avcdec_sharedlibrary.so 0x78958000libomx_m4vdec_sharedlibrary.so 0x78930000libomx_m4venc_sharedlibrary.so 0x788f0000libomx_mp3dec_sharedlibrary.so 0x788d0000libopencore_mp4local.so        0x78800000libopencore_mp4localreg.so     0x78700000libopencore_player.so          0x78400000# opencore hardware supportlibmm-adspsvc.so              0x783c0000libOmxCore.so                 0x783a0000libOmxMpeg4Dec.so             0x78370000libOmxH264Dec.so              0x78340000libOmxVidEnc.so               0x78310000libopencorehw.so              0x78300000libopencore_common.so         0x78180000#libqcomm_omx.so               0xA5A00000# libraries for specific apps or temporary librarieslibcam_ipl.so           0x6F000000libwbxml.so             0x6E800000libwbxml_jni.so         0x6E400000libxml2wbxml.so         0x6E000000libaes.so               0x6DC00000libdrm1.so              0x6D800000libdrm1_jni.so          0x6D400000libwapcore.so           0x6D000000libstreetview.so        0x6CC00000libwapbrowsertest.so    0x6C800000libminiglobe.so         0x6C400000libearth.so             0x6C000000libembunit.so           0x6BC00000libneon.so              0x6B800000libjni_example.so       0x6B400000libjni_load_test.so     0x6B000000libjni_lib_test.so      0x6AC00000librunperf.so           0x6A800000libctest.so             0x6A700000libUAPI_jni.so          0x6A500000librpc.so               0x6A400000libtrace_test.so        0x6A300000libsrec_jni.so          0x6A200000libcerttool_jni.so      0x6A100000libacc.so               0x6A000000libbinder.so            0x69F00000libskia.so              0x69000000libGLES_android.so      0x68800000libRS.so                0x68000000libaudiopolicygeneric.so 0x67c00000librs_jni.so            0x67800000# Sigma Designs librarieslibcore.so                      0x61400000libdisplay.so                   0x61000000libdrm.so                       0x60c00000libhw.so                        0x60800000libplayback.so                  0x60000000

     從這個map檔案我們可以查詢到每個lib庫的載入基地址。比如libc.so將會被核心載入到0x7EF00000,libsqlite.so載入到0x7B100000。我們可以對照一下Crash的log資訊也對應的上,說明這個檔案在Android載入過程中起了作用。

     下一步我們需要反組譯碼libc.so和libsqlite.so。一般交叉編譯器都提供了反組譯碼的工具,我的mips平台提供了mips-linux-gnu-objdump命令來進行反組譯碼。

mips-linux-gnu-objdump -dS libc.so > libc.dumpmips-linux-gnu-objdump -dS libsqlite.so > libsqlite.dump

     這樣就可以得到libc和libsqlite的符號表。然後通過符號表,Android載入動態庫的基地址,log資訊就可以定位到那個函數出問題了,如果你對對應平台組合語言熟悉的話可以閱讀彙編代碼找出問題。本文就不具體講怎樣利用這個三個檔案資訊了。有了這個三個檔案,稍一研究就可以明白怎樣分析了。

     一般情況下,Crash都不是Android源碼的問題,最有可能的是核心有些模組沒有編譯進去。本例中就是和Mutex相關的模組沒有編譯進核心引起的問題。

     以上是個人摸索出來的方法,如果你有更好的方法或者我的方法有錯誤,請你不吝指教。

反組譯碼調試Android

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.