Quali sono alcune tecniche per la risoluzione dei problemi di violazione dell'accesso molto intermittente su un dispositivo Windows Mobile?

StackOverflow https://stackoverflow.com/questions/402957

Domanda

Ho una grande applicazione Compact Frameworks V2.0 che nella maggior parte dei casi funziona molto bene. Su alcuni dispositivi circa una volta al giorno, un utente riceve un errore nativo 0xC0000005 che non viene rilevato con il blocco Try / Catch gestito standard.

La mia applicazione si sincronizza con il server tramite chiamate ASMX a intervalli fissi. Il problema sembra verificarsi durante la sincronizzazione. Esiste una considerevole logica aziendale oltre alla chiamata ASMX che si verifica al momento della sincronizzazione, ma il 98% di questo è un codice gestito. Ho esaminato tutte le mie librerie C ++ P / Invokes e le applicazioni e a questo punto sono sicuro al 95% che non è il problema.

Poiché ciò accade solo su alcuni dispositivi e molto raramente (meno di una volta al giorno) è molto difficile isolare. Ho istruito il mio codice e sembra che accada in punti casuali all'interno dell'applicazione, quindi sospetto che qualcosa stia danneggiando la memoria.

Qualsiasi pensiero su come risolvere ulteriormente questo sarebbe apprezzato.

È stato utile?

Soluzione 2

La mia gestione delle eccezioni C ++ nativa non includeva l'eccezione asincrona e quindi non rilevava eccezioni di violazione dell'accesso.

Questo potrebbe / potrebbe non essere utile per il mio problema, ma potrebbe essere utile per gli altri.

L'uso dell'opzione / EHa come documentato in questo collegamento consentirà di rilevare questi tipi di eccezioni:

http://msdn.microsoft.com/en-us/library /1deeycx5.aspx

Altri suggerimenti

Uno 0xC0000005 è una violazione di accesso, quindi qualcosa sta provando a leggere o scrivere a un indirizzo a cui non ha diritti di accesso. Questi tendono ad essere davvero difficili da trovare e l'esperienza è uno dei migliori strumenti (anche il debugger di Platform Builder è davvero utile, ma è una strada completamente separata per il debug e richiede un'esperienza che probabilmente non hai o che avresti già provato). Trovo che la registrazione tenda a essere meno utile della codifica sottrattiva - rimuovere le chiamate P / invocare con chiamate gestite simulate quando possibile.

Le violazioni dell'accesso nelle app gestite si verificano in genere per uno di questi motivi:

  • P / Invoca un'API nativa che passa un handle a un oggetto gestito e l'API nativa lo utilizza. Se ricevi una raccolta e una compattazione mentre l'API nativa è in esecuzione, l'oggetto gestito potrebbe spostarsi e il puntatore diventerà non valido.
  • P / Invoca qualcosa con un buffer che è troppo piccolo o più piccolo della dimensione che passi e l'API supera una lettura o una scrittura
  • Un puntatore (IntPtr, ecc.) che passi a una chiamata P / Invoke non è valido (-1 o 0) e il nativo non lo controlla prima dell'uso
  • P / Richiama una chiamata nativa e il codice nativo esaurisce la memoria (di solito virtuale) e non verifica l'assegnazione non riuscita e legge / scrive su un indirizzo non valido
  • Utilizzi una GCHandle che non è inizializzata o che in qualche modo punta a un oggetto già finalizzato e raccolto (quindi non punta a un oggetto, ma punta a un indirizzo in cui si trovava un oggetto)
  • La tua app utilizza un handle per qualcosa che è stato invalidato da uno sleep / wake. Questo è più esoterico ma sicuramente succede. Ad esempio, se si esegue un'applicazione da una scheda di memoria, l'intera app non viene caricata nella RAM. I pezzi in uso vengono sottoposti a paginazione per l'esecuzione. Va tutto bene. Ora se si spegne il dispositivo, tutti i driver si spengono. Quando si esegue il backup, molti dispositivi ricollegano semplicemente i dispositivi di archiviazione. Quando la tua app deve richiedere la pagina in più programmi, non è più dove si trovava e muore. Un comportamento simile può verificarsi con i database nei negozi montati. Se si dispone di un handle aperto per il database, dopo un ciclo di sospensione / riattivazione l'handle di connessione potrebbe non essere più valido.

Noterai la tendenza qui che quasi tutti sono P / Invoke e questo non è un caso. È abbastanza difficile ottenere codice gestito per farlo da solo.

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