我正在开发与流媒体有关的 native 应用程序,我在我的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类的行。

根据对my previous question的评论,我遵循rahul给出的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并由Nicklas Ansman特别建议,我已经显示了我想要的行142e周围的代码段。

现在,任何人都可以告诉47b0 blx r6是什么意思?

我所知道的是我不知道用汇编语言编写的东西。因此,在理解这条线时,我需要您的帮助。

提前致谢

最佳答案

blx跳转到参数指定的地址;在这里,到当前加载到寄存器r6中的地址。同样,返回地址(即位于ldr之后的blx操作码的地址)被写入专用寄存器lr(作为“链接寄存器”)。

这对应于一个间接调用。在C语言中,它看起来像是通过函数指针进行的调用。在某些具有动态链接的平台上,对函数的简单函数调用也可能类似于您在此处看到的内容。

无论如何,寄存器转储显示r6在那一点为0,因此出现段错误。 r6是从地址1424上的ldr操作码加载的。这将从地址r0 + r1处的内容加载r6,而r1刚好设置为132。 r0是C函数第一个参数的常规寄存器。

10-08 09:22