Sto cercando di rilevare segnali come SIGSEGV nella mia app Android NDK per scopi di debug. Per quello, ho impostato una sigaction che viene chiamata.Android _Unwind_Backtrace inside sigaction
Ora sto cercando di ottenere lo stack della chiamata. Il problema è che _Unwind_Backtrace
funziona solo su stack correnti e sessioni di sigaction all'interno del proprio stack.
Quindi, c'è un modo per ottenere la pila del puntatore di esecuzione che ha ricevuto il segnale? (Fondamentalmente dire _Unwind_Backtrace
per rilassarsi un'altra pila di quello attuale?)
Tengo a precisare che:
utilizzando
backtrace()
ebacktrace_symbols()
non è un'opzione in quanto tali funzioni non sono consegnati in Android NDKSto utilizzando GDB per indagare sugli arresti anomali sui dispositivi locali. Non voglio sostituire GDB, voglio essere in grado di ricevere tracce di stack significative dal client quando gli mando una build di test.
EDIT: Ho provato con libcorkscrew di Android dal sistema/core, come proposto dal Fadden, ma quando uso la sua funzione unwind_backtrace_signal_arch, ottengo uno strano backtrace che non rappresentano l'incidente.
Ho cercato ma non riesco a capire dalla tua risposta come scaricare una pila con un puntatore ucontext. Hai qualche esempio? –
ucontext.h non è fornito in bionico, che è ciò che Android utilizza. Sono anche molto interessato a come estrarre informazioni da questa struttura su una piattaforma in cui la struttura non esiste. Devo fidarmi che sia lo stesso membro che ordina come in Linux, e basta estrarre il PC e l'SP dall'indirizzo di memoria? – codetaku
ucontext.h fa parte di bionic, anche se potrebbe non essere disponibile da NDK (consultare https://android.googlesource.com/platform/bionic/+/kitkat-release/libc/kernel/arch-arm/asm/ucontext.h). Non che faccia molto bene - ha una definizione piuttosto generica. AFAIK non esiste alcuna personalizzazione specifica per Android per ucontext. – fadden