android 調試中 addr2line 命令的使用

來源:互聯網
上載者:User

關於調試:調試中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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.