2012-04-17 11 views
6

Qualcuno può spiegare a me il significato delle seguenti avvertenze quando si esegue il mio Applicazione Android (gli avvertimenti vengono emessi in sequenza come data):significato di Dalvik codici VM VFY

04-17 15:29:11.693: I/dalvikvm(4442): DexOpt: access denied from Lcom/kirona/iclient/db/core/services/impl/MiscDatabaseModuleDaoImpl; to field Lcom/kirona/iclient/database/common/impl/AbstractDatabaseModuleDao;.logger 
04-17 15:29:11.653: W/dalvikvm(4442): VFY: unable to resolve static field 30 (logger) in Lcom/kirona/iclient/db/core/services/impl/MiscDatabaseModuleDaoImpl; 
04-17 15:29:11.653: D/dalvikvm(4442): VFY: replacing opcode 0x62 at 0x0001  
04-17 15:29:11.693: D/dalvikvm(4442): VFY: dead code 0x0046-006e in Lcom/kirona/iclient/db/core/services/impl/MiscDatabaseModuleDaoImpl;.getSequenceNextVal (Ljava/lang/String;)J 

L'applicazione sembra funzionare bene ma ho bisogno di capire il problema poiché abbiamo applicazioni più complicate con errori simili che mandano in crash il dalvikvm.

risposta

4

Il problema sembra essere che la classe MiscDatabaseModuleDaoImpl sta tentando di accedere al campo AbstractDatabaseModuleDao.logger, ma non può, a causa di restrizioni di accesso (ad esempio privato, protetto, ecc.). In questo caso, l'opcode sget-object (opcode 0x62) che accede a questo campo viene sostituito con uno che genera un'eccezione di verifica, che probabilmente causerebbe un arresto anomalo del runtime se eseguito.

Inoltre, l'ultimo messaggio fa riferimento a codice guasto nel metodo MiscDatabaseModuleDaoImpl.getSequenceNextVal. Questo è innocuo: non causerà alcun problema durante il runtime. Tuttavia, non sarebbe una cattiva idea scoprire esattamente che cos'è il codice morto e rimuoverlo. Puoi disassemblare la tua applicazione usando baksmali, con l'opzione --code-offset, e poi guarda allo smontaggio di quel metodo. L'opzione --code-offset imposta un commento prima di ogni istruzione contenente l'offset. Per il messaggio di errore, gli offset da 0x46 a 0x6e sono codice morto. Ci dovrebbero anche essere le direttive .line nelle vicinanze, che corrisponderanno ai numeri di riga corrispondenti dal file java originale.

+1

grazie per l'intuizione. quello che era è ** AbstractDatabaseModuleDao ** ha dichiarato un logger statico privato, tuttavia questa classe astratta è stata estesa anche da un'altra classe astratta che ha dichiarato un logger statico protetto. il dalvikvm non mi è piaciuto L'altra conseguenza era un codice nel metodo ** getSequenceNextVal ** chiamato logger. Tuttavia dalvikvm sostituisce questo codice e lo fa diventare un codice morto (credo). La semplice rimozione della dichiarazione del logger statico ha risolto entrambi i problemi. Grazie – paul

+0

Ah, si. Sembra giusto. Quando l'opcode che accede al logger è stato sostituito con uno che lancia un VerificationError, il codice immediatamente successivo sarebbe morto. – JesusFreke

+0

@JesusFreke, lo stesso problema con me, dissolvo questo problema, sto provando da 10 a 15 giorni, ma non so come risolvere. Sto ottenendo questo tipo di eccezione = ("12-30 22: 40: 13.202: I/dalvikvm (400): Impossibile trovare il metodo com.anm.cms.core.util.AES128Bit.encrypt, a cui si fa riferimento dal metodo com. w2i.MainActivity.onCreate – tazeenmulani

Problemi correlati