Pergunta

Estou desenvolvendo um aplicativo nativo relacionado ao streaming, estou enfrentando alguns problemas no meu módulo C ... e o que tenho é alguma mensagem do Logcat


Aqui está a mensagem 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

Esta é a linha que representa a classe C que eu uso.


Conforme comentários sobre Minha pergunta anterior Eu segui o URL fornecido por Rahul e despejei meu arquivo .So em um arquivo de texto.

Aqui está esse arquivo de texto

 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

Então, de acordo com o Postagem no Google Grupos e especialmente sugerido por Nicklas Ansman, eu havia mostrado o trecho que está em torno da minha linha desejada 142e.

Agora qualquer pessoa aqui pode dizer o que faz 47b0 blx r6 significa?

O que eu sabia é que é algo escrito na linguagem de montagem que eu não conheço. Então, preciso da sua ajuda para entender essa linha.

desde já, obrigado

Foi útil?

Solução

blx salta para o endereço dado pelo argumento; Aqui, para o endereço que está atualmente carregado no Registro R6. Além disso, o endereço de retorno (a saber, o endereço do ldr opcode que está localizado imediatamente após o blx) está escrito no registro de fins especiais LR (como "Link Register").

Isso corresponde a uma chamada indireta. Em C, seria uma chamada através de um ponteiro de função. Em algumas plataformas com vinculação dinâmica, uma simples chamada de função para uma função também pode se tornar algo como o que você vê aqui.

De qualquer forma, o despejo do registro mostra R6 como 0 nesse ponto, daí o segfault. R6 foi carregado do ldr Opcode no endereço 1424. Isso carrega R6 do que estava no endereço R0+R1, R1 sendo definido como 132 logo acima. R0 é o registro convencional para o primeiro argumento para uma função C.

Outras dicas

Ok, descubra com algumas escavações estranhas no Google. '

blx significa Branch and link with exchange (BLX) E se eu não estou errado, é semelhante a return withValue Tipo de declaração Java.

Isso me ajudou a começar a depurar o código nativo também ......

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top