Come utilizzare addr2line in Android
-
24-10-2019 - |
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-?
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