.soファイルのobjdumpは?メッセージを理解する助けが必要
-
25-09-2019 - |
質問
私はCモジュールにいくつかの問題に直面しています、ストリーミングに関連したネイティブアプリケーションを開発して...と私は何を持っていることはLogcatからいくつかのメッセージであるのです。
<時間>ここで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クラスを表す線である。
<時間>私のコメントのとおり私は、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
ようポストあたりのグーグルでグループは、私は私の所望の線142e
の周りにあるスニペットを示していたと特別ニクラスAnsmanによって示唆されます。
47b0 blx r6
手段を何伝えることができ、ここで今缶誰?
どのような私は知っていたこと、それは私が知らないことをアセンブリ言語で書かれたものですです。私はその行を理解する上で、あなたの助けを必要とします。
事前に感謝します。
解決
blx
は、引数で指定されたアドレスにジャンプします。ここでは、現在のレジスタR6にロードされているアドレスへ。また、リターンアドレス(ldr
の直後に配置されblx
オペコードの、すなわちアドレス)(「リンク・レジスタ」のような)特殊目的レジスタLRに書き込まれる。
間接呼び出しにこれに相当します。 Cでは、関数ポインタを介してコールのようになります。動的リンクを持ついくつかのプラットフォームでは、関数への単純な関数呼び出しはまた、あなたがここで見るもののようなものになることができます。
とにかく、レジスタダンプショーは、その時点で0になるように、したがってセグメンテーション違反をR6。 R6は、ちょうど上記の132に設定されているアドレスR0 + R1、R1であったものから、アドレス1424この負荷R6にldr
オペコードからロードされました。 R0は、C関数の最初の引数のための従来のレジスタである。
他のヒント
[OK]をGoogleでいくつかの変種掘削でそれを見つける。 '
blx
平均Branch and link with exchange (BLX)
と私は間違っていないよ場合には、Javaの文のreturn withValue
型に似ています。
それはまた、ネイティブコードでデバッグを開始するために私を助けた......