android或linux除錯addr2line工具鎖定命令的使用
檢視vmlinux核心的起始地址0對應的原始碼位置
luther@gliethttp:~/kernel$ arm-none-eabi-addr2line -f -e arch/arm/boot/compressed/vmlinux 0
_start
/home/luther/kernel/arch/arm/boot/compressed/head.S:107
其實類似於
luther@gliethttp:~/kernel$ arm-none-eabi-objdump -DS arch/arm/boot/compressed/vmlinux
關於除錯:除錯中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
V/AuthorDriver( 1006): Content is to be stored in Phone
I/DEBUG ( 667): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 667): Build fingerprint: 'luther/luther_demo/gliethttp/:2.2/FRG22D/eng.luther.20110119.100731:user/test-keys'
I/DEBUG ( 667): pid: 1006, tid: 1024 >>> /system/bin/mediaserver <<<
I/DEBUG ( 667): signal 11 (SIGSEGV), fault addr 0000000e
I/DEBUG ( 667): r0 00000000 r1 0005a4a8 r2 0000000a r3 0000000e
I/DEBUG ( 667): r4 00057778 r5 0005a4a8 r6 0000000a r7 40a2c9b0
I/DEBUG ( 667): r8 00100000 r9 a811b865 10 4092d000 fp 00025c78
I/DEBUG ( 667): ip a39c2a90 sp 40a2c970 lr a3932c71 pc afd1474a cpsr 00000030
I/DEBUG ( 667): #00 pc 0001474a /system/lib/libc.so
I/DEBUG ( 667): #01 pc 00032c6e /system/lib/libopencore_common.so
I/DEBUG ( 667): #02 pc 00031c9a /system/lib/libopencore_common.so
I/DEBUG ( 667): #03 pc 00032276 /system/lib/libopencore_common.so
I/DEBUG ( 667): #04 pc 0006b77e /system/lib/libopencore_common.so
I/DEBUG ( 667): #05 pc 0003886c /system/lib/libopencore_author.so
I/DEBUG ( 667): #06 pc 00039c28 /system/lib/libopencore_author.so
I/DEBUG ( 667): #07 pc 0002af22 /system/lib/libopencore_common.so
I/DEBUG ( 667): #08 pc 0002b13c /system/lib/libopencore_common.so
I/DEBUG ( 667): #09 pc 0002b51e /system/lib/libopencore_common.so
I/DEBUG ( 667): #10 pc 00038476 /system/lib/libopencore_author.so
I/DEBUG ( 667): #11 pc 000385b8 /system/lib/libopencore_author.so
I/DEBUG ( 667): #12 pc 0001b8ca /system/lib/libutils.so
I/DEBUG ( 667): #13 pc 0001103c /system/lib/libc.so
I/DEBUG ( 667): #14 pc 00010b20 /system/lib/libc.so
I/DEBUG ( 667):
I/DEBUG ( 667): code around pc:
I/DEBUG ( 667): afd14728 99021c30 f7fa1c2a 1976ecb8 d1c62f00
I/DEBUG ( 667): afd14738 70342400 2600e001 98039603 bdf0b005
I/DEBUG ( 667): afd14748 5ec0230e 46c04770 4c0db510 4a0e4b0d
I/DEBUG ( 667): afd14758 18e3447c 1c1818a2 30cc327c 60132100
I/DEBUG ( 667): afd14768 60196059 3254330c d1f84283 58e04b07
I/DEBUG ( 667):
I/DEBUG ( 667): code around lr:
I/DEBUG ( 667): a3932c50 f7ef1c20 1c20ede6 46c0bd10 1c04b510
I/DEBUG ( 667): a3932c60 20016042 680b7220 680860e3 eec2f7ef
I/DEBUG ( 667): a3932c70 20006320 46c0bd10 1c04b510 280068c0
I/DEBUG ( 667): a3932c80 f7efd003 3001ef48 2001d102 bd104240
I/DEBUG ( 667): a3932c90 f7ef68e0 f7f0eeb0 e7f8e804 7d03b510
I/DEBUG ( 667):
I/DEBUG ( 667): stack:
I/DEBUG ( 667): 40a2c930 000013fc
I/DEBUG ( 667): 40a2c934 000001b8
I/DEBUG ( 667): 40a2c938 00100000
I/DEBUG ( 667): 40a2c93c a811b865 /system/lib/libutils.so
I/DEBUG ( 667): 40a2c940 4092d000
I/DEBUG ( 667): 40a2c944 afd0be39 /system/lib/libc.so
I/DEBUG ( 667): 40a2c948 00000000
I/DEBUG ( 667): 40a2c94c afd103f0 /system/lib/libc.so
I/DEBUG ( 667): 40a2c950 32321724
I/DEBUG ( 667): 40a2c954 6f5ef5ee
I/DEBUG ( 667): 40a2c958 00000000
I/DEBUG ( 667): 40a2c95c afd103f0 /system/lib/libc.so
I/DEBUG ( 667): 40a2c960 00000003
I/DEBUG ( 667): 40a2c964 afd41724 /system/lib/libc.so
I/DEBUG ( 667): 40a2c968 df002777
I/DEBUG ( 667): 40a2c96c e3a070ad
I/DEBUG ( 667): #01 40a2c970 000545b4 [heap]
I/DEBUG ( 667): 40a2c974 a3931c9f /system/lib/libopencore_common.so
I/BootReceiver( 730): Copying /data/tombstones/tombstone_07 to DropBox (SYSTEM_TOMBSTONE)
[ 428.915000] binder: release 1006:1014 transaction 3098 in, still active
[ 428.922000] binder: send failed reply for transaction 3098 to 1023:1023
I/ServiceManager( 664): service 'media.audio_flinger' died
I/ServiceManager( 664): service 'media.player' died
I/ServiceManager( 664): service 'media.camera' died
I/ServiceManager( 664): service 'media.audio_policy' died
W/IMediaDeathNotifier( 1023): media server died
V/MediaRecorder( 1023): died
V/MediaRecorder( 1023): message received msg=1, ext1=100, ext2=0
W/AudioSystem( 730): AudioFlinger server died!
W/AudioSystem( 730): AudioPolicyService server died!
D/dalvikvm( 730): GC_FOR_MALLOC freed 1918 objects / 557832 bytes in 299ms
D/dalvikvm( 730): GC_FOR_MALLOC freed 206 objects / 322368 bytes in 264ms
I/ ( 1028): ServiceManager: 0xacd0
V/AudioHardwareInterface( 1028): Creating Vendor Specific AudioHardware
V/MediaPlayerService( 1028): MediaPlayerService created
I/CameraService( 1028): CameraService started: pid=1028
V/AudioPolicyService( 1028): Using hardware specific audio policy
V/AudioFlinger( 1028): registerClient() 0x1c7ac, tid 1028, calling tid 1028
V/AudioFlinger( 1028): Adding notification client 0x1c7b0
V/AudioFlinger( 1028): openOutput(), Device 2, SamplingRate 0, Format 0, Channels 0, flags 0
http://www.ibm.com/developerworks/cn/linux/l-graphvis/
使用 Addr2line 將函式地址解析為函式名
Addr2line 工具(它是標準的 GNU Binutils 中的一部分)是一個可以將指令的地址和可執行映像轉換成檔名、函式名和原始碼行數的工具。這種功能對於將跟蹤地址轉換成更有意義的內容來說簡直是太棒了。
要了解這個過程是怎樣工作的,我們可以試驗一個簡單的互動式的例子。(我直接從 shell 中進行操作,因為這是最簡單地展示這個過程的方法,如清單 4 所示。)這個示例 C 檔案(test.c)是通過 cat 一個簡單的應用程式實現的(也就是說,將標準輸出的文字重定向到一個檔案中)。然後使用 gcc 來編譯這個檔案,它會傳遞一些特殊的選項。首先,要(使用 -Wl 選項)通知連結器生成一個映像檔案,並(使用 -g 選項)通知編譯器生成除錯符號。最終生成可執行檔案 test。得到新的可執行應用程式之後,您就可以使用
grep 工具在映像檔案中查詢 main 來尋找它的地址了。使用這個地址和 Addr2line 工具,就可以判斷出函式名(main)、原始檔(/home/mtj/test/test.c)以及它在原始檔中的行號(4)。
在呼叫 Addr2line 工具時,要使用 -e 選項來指定可執行映像是 test。通過使用 -f 選項,可以告訴工具輸出函式名。
清單 4. addr2line 的一個互動式例子
$ cat >> test.c
#include
int main()
{
printf("Hello World\n");
return 0;
}
$ gcc -Wl,-Map=test.map -g -o test test.c
$ grep main test.map
0x08048258 __libc_start_main@@GLIBC_2.0
0x08048258 main
$ addr2line 0x08048258 -e test -f
main
/home/mtj/test/test.c:4
$
原帖地址:http://blog.csdn.net/yanzheng1113/article/details/8148091
1.將ndk中的arm-linux-androideabi-addr2line可執行檔案的路徑加入配置檔案~/.bashrc中,例如:
export PATH=$PATH:~/dlna/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin
2.使配置生效:source ~/.bashrc
3.使用工具。例如:arm-linux-androideabi-addr2line -C -f -e ~/workspace/DLNA/libs/armeabi/libctrlpt.so 0003deb4
其中,0003deb4為堆疊資訊中pc的值。
android應用崩潰的除錯方法
有兩種方法可以分析 crash 的堆疊資訊
1 google提供了一個python指令碼,可以從
http://code.google.com/p/android-ndk-stacktrace-analyzer/
下載這個python指令碼,然後使用 adb logcat -d > logfile 匯出 crash 的log,
使用 arm-eabi-objdump 位於build/prebuilt/linux-x86/arm-eabi-4.2.1/bin下面
把so或exe轉換成彙編程式碼,如:arm-eabi-objdump -S mylib.so > mylib.asm,
使用指令碼
python parse_stack.py <asm-file> <logcat-file>
2 直接使用NDK下面的arm-linux-androideabi-addr2line
(D:\android-ndk-r8\toolchains\arm-linux-
androideabi-4.4.3\prebuilt\windows\bin\arm-linux-androideabi-addr2line.exe)
例如:arm-linux-androideabi-addr2line -C -f -e libxxx.so 0x#####(address)
android除錯工具addr2line使用補充
使用addr2line追蹤自有動態庫(so檔案)的bug, 補充:
解決出現 ??:0 , 沒法展示原始碼行數的問題
在Android.mk 檔案中:
- LOCAL_CFLAGS := -D__STDC_CONSTANT_MACROS -Wl,-Map=test.map -g
補充2個編譯引數
-Wl,-Map=test.map -g .
增加gcc警告和除錯標誌
arm-linux-androideabi-addr2line -C -f -e /專案目錄/obj/local/armeabi/libfaa_jni.so 0024362e
tip: 1,注意除錯檔案的位置在obj目錄下,並非libs目錄下生成的so檔案
2,0024362e
為出錯的機制位置
還有:
在jni/目錄下增加Application.mk 檔案, 修改為debug 模式,進行除錯 APP_OPTIM := debug
具體application.mk 檔案的配置見: http://blog.csdn.net/weidawei0609/article/details/6561280
相關文章
- Android除錯工具Genymotion的使用Android除錯
- Android除錯命令收錄Android除錯
- Linux下的除錯工具Linux除錯
- linux串列埠命令列除錯Linux串列埠命令列除錯
- Android 用adb 列印linux核心除錯資訊dmesg和kmsg命令AndroidLinux除錯
- Linux 黑乎乎的命令列下,如何除錯 Python?Linux命令列除錯Python
- Linux rm命令:刪除檔案或目錄Linux
- Linux核心使用gdb除錯Linux除錯
- 【linux學習--工具篇】串列埠除錯工具Linux串列埠除錯
- linux 下vim中關於刪除某段,某行,或全部刪除的命令Linux
- 使用 userdel 命令刪除 Linux 中的使用者Linux
- Linux中使用GDB除錯程式Linux除錯
- Android除錯工具-ADB史上最強介紹Android除錯
- Flutter的命令列除錯Flutter命令列除錯
- console除錯命令除錯
- python五種除錯或排錯的方法Python除錯
- Linux除錯Linux除錯
- 使用GDB除錯Android Native 層程式碼除錯Android
- Linux建立使用者、設定密碼、修改使用者、刪除使用者命令Linux密碼
- Linux檢查硬體錯誤工具—mcelog命令Linux
- Android 中 WebView 的除錯方法AndroidWebView除錯
- linux的刪除檔案命令和強制刪除命令Linux
- Android除錯神器stetho使用詳解和改造Android除錯
- android 無線除錯Android除錯
- 如何在Linux中鎖定和解鎖多個使用者Linux
- Linux基礎命令---刪除使用者userdelLinux
- 在 Linux 中鎖定和解鎖使用者帳戶的三種方法Linux
- .NET中使用DebuggerDisplay輕鬆定製除錯除錯
- UE Puerts 在 Android 的除錯方法Android除錯
- linux的date命令設定Linux
- GDB除錯命令詳解除錯
- gdb高階除錯命令高階除錯
- 如何使用cgdb + qemu除錯linux核心模組除錯Linux
- 使用GDK7除錯Linux核心之KVM除錯Linux
- Android adb 網路除錯Android除錯
- linux刪除資料夾命令是什麼 linux刪除一個目錄的命令Linux
- Linux中刪除資料夾使用什麼命令?Linux
- vscode 除錯linux程式VSCode除錯Linux
- Linux中什麼命令可以設定可寫不可刪除的檔案?Linux