2012-06-20 16 views
6

Recentemente ho avuto dei problemi a cercare di simboleggiare un registro di crash di un'app per iOS. Per qualche motivo l'UUID del dSYM non è stato indicizzato in Spotlight. Dopo alcune ricerche manuali e una buona dose di incantesimi da linea di comando, sono riuscito a simboleggiare parzialmente il registro degli arresti anomali.È possibile simboleggiare il codice C++?

All'inizio pensavo che il dSYM potesse essere incompleto o qualcosa del genere, ma poi mi sono reso conto che le chiamate di metodo mancanti erano quelle che si verificano nel codice C++: questo progetto è un'app Objective-C che chiama in librerie C++ (tramite Objective-C++) che richiama il codice Objective-C (di nuovo, tramite codice Objective-C++). Le chiamate che mi mancano sono, in particolare, quelle che accadono in C++ land.

Quindi, la mia domanda è: c'è un modo in cui il processo di simbolizzazione può risolvere le chiamate di funzione del codice C++? Quali opzioni speciali devo impostare, se ce ne sono?

+0

Lascia semplicemente gli indirizzi o ti dà qualcosa come _ZN7 ...? – C0deH4cker

+0

no, non si tratta di funzioni di nome storpiato se ci si riferisce a questo. Si tratta di un indirizzo di base e un offset: 14 MyApp \t 0x001001bc 0xfe000 + 8636 15 MyApp \t 0x00100174 0xfe000 + 8564 –

+0

se 'lldb' la vostra applicazione, si può smontare qualsiasi della vostra C++ metodi per nome? Hai un file binario statico o stai compilando tutto nel tuo progetto? – nielsbot

risposta

0

Un programma utile fornito con il sdk di apple è atos (indirizzo sul simbolo). Fondamentalmente, ecco cosa vuoi fare:

atos -o myExecutable -arch armv7 0x(address here) 

Dovrebbe stampare il nome del simbolo a quell'indirizzo.

+0

Questo funziona per ObjC. Per C++, ottengo qualcosa del tipo: 0x00261588 (in MiaApp) + 465932 –

+0

Aspetta, c'è un modo per farlo con gdb ... – C0deH4cker

+0

grazie, ma sto usando LLVM anche se –

0

Non sono esperto di Objective-C, ma mi piacerebbe che il codice C++ fosse compilato con simboli. In particolare, hai fatto in modo di includere -rdynamic e/o -g durante la compilazione del codice C++?

+0

Questi sembrano bandiere per gcc. Sai come realizzare lo stesso in LLVM? –

+1

Apple utilizza LLVM come backend per gcc e clang. clang prende sostanzialmente le stesse bandiere di gcc. Assicurati che tutto il tuo codice sia compilato con il livello di debug impostato su 3. Usa '-g3'. Potresti anche voler disabilitare l'ottimizzazione ('-O0'). – sfstewman

+0

@sfstewman il livello di ottimizzazione non ha nulla da fare -AFAIK- con la simbolizzazione dopo un crash, che preferirebbe essere strippaggio. Non c'è '-g3' in clang, solo' -g' –

0

provare

dwarfdump --lookup = 0xYOUR_ADRESS YOUR_DSYM_FILE

si dovrà cercare ciascun indirizzo manualmente (o scrivere uno script per fare questo), ma se i simboli sono ok (il file è più grande dSym che dire 20 MB) questo farà il lavoro.

Problemi correlati