Arresto anomalo dell'applicazione quando si parla con Oracle a meno che il percorso eseguibile non contenga spazi
Domanda
Abbiamo un problema con i file x con la nostra applicazione .NET. O meglio, applicazione ibrida Win32 e .NET.
Quando tenta di comunicare con Oracle, muore. Svanisce. Va nel grande vuoto nero nel cielo. Nessun messaggio del registro eventi, nessuna eccezione, niente di niente.
Se invece chiediamo semplicemente all'applicazione di parlare con un MS SQL Server, che ha l'effetto di sostituire l'utilizzo di OracleConnection e delle classi correlate con SqlConnection e le classi correlate, funziona come previsto.
Oggi abbiamo avuto una svolta.
Per qualche ragione, un cliente aveva capito che posizionando tutti i file dell'applicazione in una directory sul suo desktop, funzionava come previsto anche con Oracle. Spostando la directory verso il basso nella radice dell'unità, o in C: \ Temp o, bene, un po ', riapparve l'arresto.
Fondamentalmente era riproducibile al 100% che l'applicazione funzionasse se eseguita dalla directory sul desktop e non funzionava se eseguita dalla directory nella radice.
Oggi abbiamo capito che la differenza che contava era se ci fosse o meno uno spazio nel nome della directory.
Quindi, queste directory funzionerebbero:
C:\Program Files\AppDir\Executable.exe
C:\Temp Lemp\AppDir\Executable.exe
C:\Documents and Settings\someuser\Desktop\AppDir\Executable.exe
considerando che non dovrebbero:
C:\CompanyName\AppDir\Executable.exe
C:\Programfiler\AppDir\Executable.exe <-- Program Files in norwegian
C:\Temp\AppDir\Executable.exe
Spero che qualcuno che legga questo abbia visto un comportamento simile e abbia un "aha, è necessario modificare la vibrazione sulla configurazione del driver glitz oracle" o simile.
Chiunque?
Seguito n. 1: Ok, ho elaborato l'output del procmon ora, entrambi i file da quando ho premuto il pulsante che tenta di aprire la finestra che innesca l'errore a cascata, e ho notato che tengono traccia per lo più, ci sono alcune piccole differenze nella parte superiore di entrambi i file e tengono traccia di molta strada.
Tuttavia, quando una corsa fallisce, l'altra continua e le prossime righe dell'output del registro sono queste:
ReadFile C:\oracle\product\10.2.0\db_1\BIN\orageneric10.dll SUCCESS Offset: 274 432, Length: 32 768, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O
ReadFile C:\oracle\product\10.2.0\db_1\BIN\orageneric10.dll SUCCESS Offset: 233 472, Length: 32 768, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O
Successivamente, l'esecuzione di lavoro continua a essere eseguita e l'altra tocca i file mscorwks.dll alcune volte prima della chiusura dei thread e della chiusura dell'app. Pertanto, l'esecuzione non riuscita non tocca i file sopra.
Seguito n. 2: ho pensato di provare ad aggiornare i driver del client Oracle, ma 10.2.0.1 è apparentemente la versione più alta disponibile per server Windows 2003 e client XP.
Seguito n. 3: Bene, siamo finiti con una soluzione black-box. Fondamentalmente abbiamo scoperto che il problema è da qualche parte correlato a XPO e Oracle. XPO ha una tabella di sistema che gestisce, denominata XPObjectType, con tre colonne: Oid, TypeName e AssemblyName. A causa della configurazione di Oracle nei database con cui parliamo, i nomi delle colonne erano OID, TYPENAME e ASSEMBLYNAME. Questo di solito non sarebbe un problema, tranne per il fatto che XPO parla direttamente con le informazioni dello schema e controlla se la tabella è lì con i nomi delle colonne giuste, e XPO non gestisce le differenze maiuscole, quindi vede una tabella XPObjectType con tre colonne sconosciute e nessuna di quelli che si aspetta.
Esattamente quello che fa XPO ora non lo so davvero, ma se ho lasciato cadere questa tabella e l'ho ricreata con il caso giusto, usando le doppie virgolette attorno a tutti i nomi delle colonne per ottenere il caso giusto, il problema non si ritaglia up.
Esattamente dove lo spazio nel nome della cartella arriva in questo, non ne ho ancora idea, ma questo problema aveva due livelli:
- Impedisci l'arresto anomalo dell'applicazione ai nostri clienti, soluzione a breve termine
- Correzione del bug, soluzione a lungo termine
In questo momento il livello 1 è stato risolto, il livello 2 verrà rimesso in coda per ora e avrà la priorità. Stiamo comunque affrontando alcune importanti modifiche al nostro livello di dati, quindi questo potrebbe non essere un problema che dobbiamo risolvere, almeno se tutti i nostri clienti Oracle verificano che la correzione della tabella risolva effettivamente il problema.
Accetterò la risposta di Dave Markle dal momento che Process Monitor (il fratello maggiore di File Monitor) in realtà non ho individuato il problema, sono stato in grado di usarlo per determinare che dopo il mio punto di interruzione nel codice utente in cui XPO aveva creato la query per questa tabella, nessun I / O è accaduto fino a quando tutte le voci per la chiusura dell'applicazione erano registrato, il che mi ha portato a credere che fosse il colpevole di questa tabella, o almeno influenzato il problema in qualche modo.
Se riesco ad arrivare alla vera causa di ciò, aggiornerò il post.
Soluzione
Ecco cosa farei. Innanzitutto, controlla TRIPLO di vedere il comportamento che pensi di vedere. Riesco a vederlo accadere viceversa non usando System.IO.Path per concatenare percorsi, ma non come se lo vedessi. Controlla tre volte che le autorizzazioni dei file abbiano senso.
Successivamente, scarica Filemon da MS e guarda cosa sta succedendo il filesystem mentre il tuo programma colpisce questi punti problematici. Puoi filtrare l'attività specifica del file (rimuovendo l'attività del file antivirus, ad esempio) per rendere tutto un po 'più pulito mentre lo fai. Cerca errori di accesso ai file utilizzando FileMon sia per il caso di successo che per il caso di errore per il tuo programma. Ciò dovrebbe indicare a quale file si accede e che causa il problema. Ad esempio, se visualizzi un errore FILE_NOT_FOUND
durante l'accesso a un nome di file senza senso, puoi essere certo che tu o il venditore state facendo qualcosa di sbagliato, probabilmente portando al vostro problema ...
Altri suggerimenti
Probabilmente dovresti vedere se riesci a riprodurre il problema con una semplice applicazione che tenta solo di aprire una connessione a Oracle. In questo modo puoi essere sicuro al 100% che il problema riguarda OracleConnection o il driver Oracle e non con il tuo codice.
Dovresti ottenere una medaglia per la perseveranza per questo!.
" Esattamente quello che fa XPO adesso no lo so davvero, ma se lo avessi lasciato cadere tavolo e ricreato con il diritto caso, usando virgolette doppie in tutto i nomi delle colonne per ottenere il caso giusto, il problema non si risolve.
Esattamente dove lo spazio nella cartella il nome arriva, non ne ho ancora idea "
Il problema che ho con gli spazi nei nomi è che generalmente interpretano il bit prima dello spazio come il nome e il resto come parametro. In tal caso, con il semplice nome è possibile visualizzare " C \ Temp " ed è una directory. Con il nome distanziato, ottiene " C: \ Programmi " ;, cerca " C: \ Program " e quello non esiste. Ad esempio, non sarebbe possibile sovrascrivere " C: \ Temp " ma riuscirebbe a scrivere " C: \ Program " ;. Mi chiedo se fallirebbe comunque con " C: \ Programmi " se esiste un file o una directory denominata " C: \ Program "
Sospetto che il client Oracle sia onesto. Aveva un problema che era simile nella sua natura frustrante.
Se installato su macchine a 64 bit, il client si fermerebbe all'avvio quando si connetteva a Oracle anche se l'app era a 32 bit. Alla fine lo abbiamo rintracciato al fatto che un certo client Oracle (Ora 10 aveva un problema con le parentesi nel percorso, quindi un programma in esecuzione sotto i file di programma avrebbe funzionato sotto i file di programma (x86) ha causato l'arresto anomalo. L'aggiornamento della macchina per utilizzare l'11G il client ha risolto il problema ma c'erano anche alcune patch disponibili da metalink che non sono direttamente disponibili. La cosa strana nel tuo caso è che non ottieni alcuna eccezione, ma il comportamento di spostare l'applicazione in una nuova cartella risolve il problema in modo simile, quindi può essere correlato.
ORA-12154: TNS: impossibile risolvere l'identificatore di connessione specificato o ORA-6413: Connessione non aperta.
Link utili http: / /blogs.msdn.com/debarchan/archive/2009/02/04/good-old-connectivity-issue.aspx
Dettagli da Metalink qui sotto.
Metalink Bug 3807408 Impossibile autenticare esternamente l'utente con citazione nel nome utente
Descrizione Se un nome utente autenticato esternamente contiene un '(', ')' o '=' quindi l'utente non può essere autenticato. Inoltre, se un nome / percorso del programma contiene questi caratteri, esso potrebbe non essere possibile connettersi. per esempio: Client Windows installati in una directory " C: \ Programmi (x86) " non riesco a connettersi con ORA-12154: TNS: impossibile risolvere l'identificatore di connessione specificato
Il segno distintivo di questo problema è che la traccia Net (livello 16) mostra il / i carattere / i problema / i sostituito / i da un "quot?" nella traccia.
Per risolvere il problema Per il problema di autenticazione: cambia nome utente, o non utilizzare l'autenticazione del sistema operativo remoto per quegli utenti
Per il problema di programma / directory: cambia il nome del programma / directory