2013-03-12 11 views
10

Abbiamo un'applicazione C# .Net che utilizza i servizi WCF. E l'applicazione viene distribuita nel nostro server di produzione in un'applicazione di servizio Windows. Una parte del modulo è responsabile della creazione di file shape ((* .shp, * .dbf) per un'area più piccola che i lavoratori lavoreranno oggi e li invierà a un PDA.Errore casuale: Tentativo di leggere o scrivere memoria protetta

Per scrivere i file di forma, noi utilizzare una terza dll parti, NetTopologySuite

GisSharpBlog.NetTopologySuite.IO.ShapefileWriter 

che è anche in C#. (non sono sicuro se qualche dll è l'uso di riferimento il codice non gestito.) Il sistema potrebbe funzionare bene per un po 'dire per una settimana Poi improvvisamente riceviamo un'eccezione dicendo

Attempted to read or write protected memory. 
This is often an indication that other memory is corrupt. 

dal metodo Write, in cui scriviamo la raccolta della geometria per modellare i file.

sfw.Write(FileName, new GeometryCollection(gc.ToArray())); 

(GeometryCollection è anche da una DLL di terze parti, GeoAPI.dll)

Questo errore porta giù l'intero servizio e lo rende unfunctional. Quindi riavviviamo il servizio e proviamo a eseguire nuovamente gli stessi dati, funzionerebbe bene per un'altra settimana fino a quando non si arresterà di nuovo. Succede solo nella produzione e in momenti casuali. Non siamo stati in grado di trovare la causa del problema.

Molti forum suggeriscono che potrebbe essere a causa di perdite di memoria in alcuni codici non gestiti. Ma non siamo riusciti a trovare quale.

Siamo inoltre pronti a riscrivere la parte che crea nuovi file di forma. Per favore aiutami a risolvere questo problema. Fammi sapere se sono necessari ulteriori dettagli. Grazie in anticipo.

+0

E la tua domanda è? –

+0

È possibile collegare un debugger e osservare lo stack di chiamate? – NtscCobalt

+0

Non è una perdita di memoria, è un GPF http://en.wikipedia.org/wiki/General_protection_fault o in altri termini, un bug nel mondo nativo (ad esempio, un equivalente a NullReferenceException in .NET). Controlla tutte le DLL native di terze parti che stai utilizzando. Uno di loro ha un bug, o non lo stai usando come previsto, e non ti sta dicendo bene –

risposta

7

Nella mia esperienza, quel messaggio era il risultato di una perdita di memoria. Questo è quello che farei se mi trovassi nella tua situazione, specialmente dal momento che stai lavorando su una DLL di terze parti.

1) Controlla il tuo server WCF e vedi cosa sta succedendo con il DLLHost.exe ei servizi di aspnet nel task manager. Ho la sensazione che la tua DLL di terze parti abbia una perdita di memoria che fa gonfiare questi due servizi e raggiunge il limite della memoria dei tuoi server. Questo è il motivo per cui funziona per un po 'e poi improvvisamente ha smesso di funzionare.

2) Individuare una buona pianificazione su quando è possibile riciclare la memoria del server e il pool di applicazioni. Poiché il problema è dilagante, potresti volerlo fare ogni mezzanotte o quando nessuno lo sta usando attivamente.

3) Scrivere un buon codice di registrazione degli errori per sapere esattamente cosa sta accadendo durante il periodo di impantanamento. Metterei le seguenti informazioni sui log degli errori: i parametri che stai passando, l'utente che ha riscontrato il problema ecc. In questo modo saprai esattamente cosa sta succedendo.

4) Controllare il Visualizzatore eventi perché forse ci sono alcune informazioni in là che possono individuare il problema.

4) Dopo aver eseguito 1, 2 e 3, chiamerò il vostro fornitore di terze parti DLL e vedremo cosa possono fare per aiutarvi. Potrebbe essere necessario fornire le informazioni raccolte dagli articoli 1, 2, 3 e 4 di cui sopra.

Buona fortuna e spero che questo possa essere d'aiuto.

1

Penso che tu abbia un codice non gestito nelle terze librerie che sta ottenendo un indirizzo protetto dal sistema o utilizzato da altre applicazioni.

-1

La natura casuale di questo errore, suggerirebbe che potrebbe trattarsi di thread. In particolare il metodo Write di ShapefileWriter potrebbe essere stato chiamato, ottenuto in ritardo in una discussione, quindi si chiama Close. Il metodo ritardato Write tenta quindi di scrivere su un file chiuso (e protetto), che potrebbe causare l'errore che si vede.

Questa è pura speculazione poiché non c'è molto codice per fare una supposizione migliore, ma ho riscontrato questo problema utilizzando le librerie di scrittura video, quindi potrebbe essere lo stesso nel tuo caso.

0

Si ha un Access Violation (puntatore alla memoria non appartenente al proprio spazio applicativo, incluso null/massa - 0x0 - indirizzo) in una delle DLL di terze parti.

Altrimenti, è forse un po 'non gestito COMObject che stai usando che causa questo errore.

+0

A chi ha downvoted questo, perché? La mia risposta è assolutamente corretta, dato che non ho un aspetto corretto dell'intera base di codice, non posso dire molto di più su questo caso. Dando così indicazioni necessarie su come risolvere questo problema. –

-1

Verificare di non avere thread all'interno dei thread. Questo è quello che è successo quando ho incontrato questo errore. Vedere questo link per ulteriori informazioni: Attempted to read or write protected memory. This is often an indication that other memory is corrupt

+0

era coerente o è accaduto a volte casuali dire dopo 2 settimane o 3 settimane come nel mio caso? – franklins

+0

La nostra era abbastanza coerente. Una volta che sapevamo di cosa si trattava, avremmo potuto ottenere questa eccezione entro pochi minuti dall'avvio dell'applicazione. –

Problemi correlati