Domanda

mi sono bloccato con la mia app, come io sono in grado di eseguire il debug in quanto è uno multithreaded e si blocca con SIGSEGV errore. Ottengo sacco di informazioni da LogCat, che mi dà gli indirizzi nella mia libreria nativa. Sarebbe utile se potessi convertire questi indirizzi nel mio codice.

Qualcuno ha idea di come usare addr2line, che viene fornito con Android NDK-?

È stato utile?

Soluzione

diciamo Let che logcat vi mostrerà il seguente registro incidente (questo è da uno dei miei progetti):

I/DEBUG   (   31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (   31): Build fingerprint: 'generic/sdk/generic:2.3/GRH55/79397:eng/test-keys'
I/DEBUG   (   31): pid: 378, tid: 386  >>> com.example.gltest <<<
I/DEBUG   (   31): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG   (   31):  r0 001dbdc0  r1 00000001  r2 00000000  r3 00000000
I/DEBUG   (   31):  r4 00000000  r5 40a40000  r6 4051a480  r7 42ddbee8
I/DEBUG   (   31):  r8 43661b24  r9 42ddbed0  10 42ddbebc  fp 41e462d8
I/DEBUG   (   31):  ip 00000001  sp 436619d0  lr 83a12f5d  pc 8383deb4  cpsr 20000010
I/DEBUG   (   31):          #00  pc 0003deb4  /data/data/com.example.gltest/lib/libnativemaprender.so
I/DEBUG   (   31):          #01  pc 00039b76  /data/data/com.example.gltest/lib/libnativemaprender.so
I/DEBUG   (   31):          #02  pc 00017d34  /system/lib/libdvm.so

Guarda le ultime 3 linee; questo è il vostro stack. 'Pc' è il contatore di programma, e il pc per lo stack frame # 00 si fornisce l'indirizzo dove si è verificato l'incidente. Questo è il numero di passare a addr2line.

sto usando NDK R5, quindi l'eseguibile che sto usando è situato a $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin; assicurarsi che è nel tuo $PATH. Il comando da utilizzare appare come

arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libXXX.so <address>

In alternativa, per il caso di cui sopra:

arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libnativemaprender.so 0003deb4

che vi dà la posizione dello schianto.

Nota:

  • Il flag -C è quello di demangle codice C ++
  • Utilizza il file di sotto .so obj / local / armeabi, poiché questo è il versione non spogliato

Inoltre, quando si utilizza NDK R5 con un 2,3 AVD, in realtà è possibile eseguire il debug di codice multithread.

Altri suggerimenti

C'è un modo più semplice per farlo ora (NDK-R7). Scopri il comando NDK-stack. La documentazione è in you_android_ndk_path / docs / NDK-STACK.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top