2010-11-17 61 views
5

我發展,我面對我的C模塊的一些問題,涉及到流本機應用程序...和我有什麼是logcat的objdump的.so文件?需要幫助來了解消息

一些消息

這裏是logcat的消息

INFO/DEBUG(28): Build fingerprint: 'generic/sdk/generic/:2.1-update1/ECLAIR/35983:eng/test-keys' 
11-17 12:40:07.550: INFO/DEBUG(28): pid: 5957, tid: 5957 >>> com.mmstwo <<< 
11-17 12:40:07.561: INFO/DEBUG(28): signal 11 (SIGSEGV), fault addr deadd00d 
11-17 12:40:07.561: INFO/DEBUG(28): r0 00000354 r1 00129100 r2 0000000c r3 deadd00d 
11-17 12:40:07.561: INFO/DEBUG(28): r4 00000026 r5 ad07ff50 r6 00000000 r7 fffe72f8 
11-17 12:40:07.579: INFO/DEBUG(28): r8 afe3bdfc r9 4509f020 10 00000000 fp 00135a40 
11-17 12:40:07.590: INFO/DEBUG(28): ip ad080160 sp bef28f90 lr afe14cf7 pc ad035452 cpsr 20000030 
11-17 12:40:07.840: INFO/DEBUG(28):   #00 pc 00035452 /system/lib/libdvm.so 
11-17 12:40:07.850: INFO/DEBUG(28):   #01 pc 00027a98 /system/lib/libdvm.so 
11-17 12:40:07.869: INFO/DEBUG(28):   #02 pc 00027bba /system/lib/libdvm.so 
11-17 12:40:07.879: INFO/DEBUG(28):   #03 pc 0002d98e /system/lib/libdvm.so 

11-17 12:40:07.901: INFO/DEBUG(28):   #04 pc 0000142e /data/data/com.mmstwo/lib/libnstreamer.so 

這是一個表示哪個我使用的C類的行。


按照意見對my previous question i,隨後是拉胡爾定的url和傾倒我的.so文件到一個文本文件。

這裏是文本文件

141e: 4a2d  ldr r2, [pc, #180] (14d4 <Java_com_mmstwo_NativeParser_stringFromJNI+0x408>) 
    1420: 4b2d  ldr r3, [pc, #180] (14d8 <Java_com_mmstwo_NativeParser_stringFromJNI+0x40c>) 
    1422: 2184  movs r1, #132 
    1424: 5846  ldr r6, [r0, r1] 
    1426: 18aa  adds r2, r5, r2 
    1428: 18eb  adds r3, r5, r3 
    142a: 4651  mov r1, sl 
    142c: 1c38  adds r0, r7, #0 
    142e: 47b0  blx r6 
    1430: 4b2a  ldr r3, [pc, #168] (14dc <Java_com_mmstwo_NativeParser_stringFromJNI+0x410>) 
    1432: 4669  mov r1, sp 

使每post in google groups和專門建議由尼克拉斯Ansman我表現出來的片斷這是在我的期望的行142e

現在誰可以告訴47b0 blx r6是什麼意思?

我知道的是它是用匯編語言寫的東西,我不知道。所以我需要你的幫助來理解那條線。

在此先感謝

+1

FWIW,故障地址「deadd00d」表示有意的VM中止。在中止VM之前,向日志文件寫入解釋;你應該把它放在你粘貼在這裏的東西上面。 – fadden 2010-11-23 23:57:51

回答

3

blx跳轉到由給定參數的地址;這裏是當前加載到寄存器r6中的地址。此外,返回地址(即緊接在blx之後的ldr操作碼的地址)寫入專用寄存器lr(作爲「鏈接寄存器」)。

這對應於間接調用。在C中,它看起來像通過函數指針調用。在一些使用動態鏈接的平臺上,對函數的簡單函數調用也可能變成您在此處看到的內容。

無論如何,寄存器轉儲顯示r6在那一點是0,因此segfault。 r6是從地址1424上的ldr操作碼加載的。這加載了地址r0 + r1處的r6,r1被設置爲剛好在132處。 r0是C函數第一個參數的傳統寄存器。

+0

非常感謝托馬斯,它超出了我的預期。 – Prasham 2010-11-17 13:01:15

+0

還有一件事...有沒有可用的指南,有詳細的所有彙編命令列表,並有適當的解釋? – Prasham 2010-11-17 13:10:07

+1

您可以從http://infocenter.arm.com/獲得ARM體系結構參考手冊(您必須註冊但免費)。您還需要過程調用標準(ATPCS或AAPCS,取決於代 - ARM的世界是一個很大的混亂):過程調用標準定義在什麼寄存器參數,堆棧是如何保持並對齊,等等上。 – 2010-11-17 14:40:34

0

確定找出它與一些怪胎挖掘谷歌。

blx意思是Branch and link with exchange (BLX)如果我沒有錯,它類似於return withValue類型的java語句。

它幫助我在本機代碼也開始調試......