Anwendung abstürzt, wenn sie Orakel sprechen, es sei denn ausführbaren Pfad Leerzeichen enthält

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

  •  04-07-2019
  •  | 
  •  

Frage

Wir haben ein x-Dateien Problem mit unserer .NET-Anwendung. Oder besser gesagt, Hybrid-Win32 und .NET-Anwendung.

Wenn es versucht, mit Oracle zu kommunizieren, es stirbt gerade. Schwindet. Geht auf die große schwarze Leere in den Himmel. Keine Ereignisprotokollmeldung, keine Ausnahme, kein gar nichts.

Wenn wir einfach die Anwendung fragen, anstatt zu einem MS SQL Server zu sprechen, die die Wirkung des Ersetzens die Nutzung von OracleConnection und verwandten Klassen mit SqlConnection und verwandten Klassen haben, funktioniert es wie erwartet.

Heute hatten wir einen Durchbruch.

Aus irgendeinem Grunde ein Kunde hatte herausgefunden, dass alle Anwendungsdateien in einem Verzeichnis auf dem Desktop, indem es mit Oracle so gut wie erwartet funktioniert. Verschieben Sie das Verzeichnis bis auf den Stamm des Laufwerks, oder in C:. \ Temp oder, na ja, ein bisschen herum, den Absturz wieder auftauchen gemacht

Im Grunde war es 100% reproduzierbaren, dass die Anwendung, wenn aus dem Verzeichnis auf dem Desktop läuft gearbeitet und schlug fehl, wenn aus dem Verzeichnis in root ausführen.

Heute haben wir herausgefunden, dass der Unterschied, dass zählte, war, ob es ein Raum im Verzeichnisnamen war oder nicht.

So würden diese Verzeichnisse arbeiten:

C:\Program Files\AppDir\Executable.exe
C:\Temp Lemp\AppDir\Executable.exe
C:\Documents and Settings\someuser\Desktop\AppDir\Executable.exe

während diese würden nicht:

C:\CompanyName\AppDir\Executable.exe
C:\Programfiler\AppDir\Executable.exe      <-- Program Files in norwegian
C:\Temp\AppDir\Executable.exe

Ich bin die Hoffnung, jemand der Lektüre dieses ähnliches Verhalten gesehen hat und hat einen „Aha, Sie brauchen die frob auf der Oracle-glitz Treiberkonfiguration twiddle“ oder ähnlich.

Wer?


Followup # 1: Ok, ich habe die procmon Ausgabe nun verarbeitet, beide Dateien aus, wenn ich den Knopf drücken, der das Fenster zu öffnen versucht, die die Kaskade Ausfall auslöst, und ich habe festgestellt, dass sie zu verfolgen meist, da in der Nähe der Spitze der beiden Dateien einige kleinere Unterschiede ist, und sie halten sie durch einen langen Weg verfolgen.

Wenn man jedoch Lauf ausfällt, hält die andere gehen, und die nächsten paar Zeilen der Protokollausgabe sind diese:

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

Danach geht der Arbeitslauf durchzuführen, und die andere berühren die mscorwks.dll Dateien ein paar Mal vor Threads schließen und die App geschlossen wird. Somit muss der gescheiterte Lauf nicht die oben genannten Dateien berühren.


Followup # 2:. Dache, ich würde versuchen, die Oracle-Client-Treiber zu aktualisieren, aber 10.2.0.1 ist offenbar die höchste Version für Windows 2003 verfügbar Server und XP-Clients


Followup # 3: Nun haben wir mit einer Black-Box-Lösung enden. Grundsätzlich fanden wir, dass das Problem irgendwo im Zusammenhang mit XPO und Oracle. XPO hat eine System-Tabelle es schafft, die so genannte XPObjectType, mit drei Spalten: Oid, Type-Name und Assembly. Aufgrund wie Oracle in den Datenbanken konfiguriert ist, wir reden, waren die Spaltennamen OID, und TYPENAME assembly. Dies würde normalerweise kein Problem, außer dass XPO spricht mit den Schema-Informationen direkt und überprüft werden, wenn die Tabelle mit den richtigen Spaltennamen gibt es, und XPO behandelt nicht Groß- und Kleinschreibung, so dass es eine XPObjectType Tabelle mit drei unbekannten Spalten und keinem sieht von denen es erwartet.

Genau das, was XPO tut jetzt weiß ich nicht wirklich, aber wenn ich diese Tabelle gelöscht und neu erstellt es mit dem richtigen Fall mit doppelten Anführungszeichen um alle Spaltennamen rechts, um den Fall zu erhalten, tritt das Problem nicht Ernte up.

Genau dort, wo der Raum, in dem Ordnernamen in das kommt, ich habe noch keine Ahnung, aber dieses Problem hat zwei Ebenen:

  1. Halten Sie die Anwendung abstürzt bei unseren Kunden, kurzfristige Lösung
  2. Befestigen Sie den Fehler, langfristige Lösung

Im Moment Tier 1 gelöst, Stufe 2 wird nun in die Warteschlange gestellt werden, zurück und priorisiert. Wir sind einige größere Änderungen an unsere Datenebene gegenüber ohnehin so dies kein Problem, das wir lösen müssen sein könnte, zumindest, wenn alle unsere Oracle-Kunden überprüfen, ob der Tisch-fix das Problems wird eigentlich los zu werden.

Ich werde die Antwort von Dave Markle da obwohl Process Monitor (der große Bruder von File Monitor) eigentlich nicht das Problem lokalisieren, ich war in der Lage, es zu benutzen, um festzustellen, dass nach meinem Breakpoint in Benutzer-Code, wo XPO aufgebaut hatte die Abfrage für diese Tabelle, keine E / A passiert ist, bis alle Einträge für die Anwendung nach unten angemeldet waren zu schließen, was mich dazu gebracht, diese Tabelle zu glauben, es war, dass der Täter, oder zumindest das Problem irgendwie beeinflusst war.

Wenn ich auf die wirkliche Ursache für diese erhalten verwalten, ich werde den Beitrag aktualisieren.

War es hilfreich?

Lösung

Hier ist, was ich tun würde. Zuerst TRIPLE-überprüfen Sie, dass Sie das Verhalten sind zu sehen, Sie denken, Sie sehen. Ich sehe dies anders herum geschieht durch nicht System.IO.Path mit Pfaden verketten, aber nicht wie Sie sehen es. Triple-überprüfen, ob die Dateiberechtigungen Sinn machen.

Als nächstes herunterladen Filemon von MS und beobachten, was hier geschieht, das Dateisystem als Ihr Programm trifft diese schwierigen Stellen. Sie können bestimmte Dateiaktivität (Entfernen von Antiviren-Dateiaktivität, zum Beispiel) herauszufiltern, um alles ein bisschen sauberer aussehen, während Sie dies tun. Suchen Sie nach Fehlern Dateizugriff mit FileMon sowohl für den Erfolgsfall und Fehlerfall für Ihr Programm. Das sollte Sie Datei, auf die zugegriffen und verursacht das Problem hinweisen, in welchem. Zum Beispiel, wenn Sie einen Fehler FILE_NOT_FOUND sehen einen Nonsense-Dateinamen zugreifen, können Sie sicher sein, dass Sie oder der Verkäufer tun etwas falsch, was möglicherweise zu Ihrem Problem führen ...

Andere Tipps

Sie sollten wahrscheinlich sehen, wenn Sie das Problem mit einer einfachen Anwendung wiedergeben können, die nur eine Verbindung zu Oracle zu öffnen versucht. So können Sie 100% sicher sein können, dass das Problem mit OracleConnection oder den Oracle-Treiber und nicht mit Ihrem eigenen Code.

Sie sollten eine Medaille für Ausdauer für das!.

  

"Genau das, was XPO tut jetzt weiß ich nicht   wirklich wissen, aber wenn ich fiel diese   Tisch, und neu mit dem rechten   Fall doppelte Anführungszeichen um all   die Spaltennamen, den Fall zu erhalten   Recht, das Problem zuzuschneiden nicht auf.

     

Genau dort, wo der Raum, in dem Ordner   Namen in das kommt, ich habe immer noch keine   Idee "

Die Fragen, die ich mit Leerzeichen in Namen erhalten sind, dass sie in der Regel das Bit vor dem Raum mit dem Namen und dem Rest als Parameter interpretieren. Wenn das der Fall ist, dann mit dem Klarnamen kann es „C \ Temp“ sehen, und es ist ein Verzeichnis. Mit dem Abstand Namen, wird es „C: \ Program Files“, sucht nach „C: \ Program“ und das nicht existiert. Es wäre nicht zum Beispiel zu überschreiben „C: \ Temp“ aber schriftlich „C: \ Program“ erfolgreich sein würde. Ich frage mich, ob es noch scheitern würde „C: \ Program Files“, wenn es eine Datei oder ein Verzeichnis namens „C: \ Programme“

Id das Oracle-Client vermutet, ehrlich zu sein. Hat ein Problem, das in Es ist frustrierend Natur ähnlich war.

Wenn wir auf 64-Bit-Rechnern installiert der Client würde beim Start stoppen, wenn Verbindung zu Oracle, auch wenn die App 32 Bit ist. Wir verfolgten sie schließlich auf die Tatsache, dass eine bestimmte Oracle-Client (Ora 10 ein Problem mit Klammern auf dem Weg hatte so ein Programm unter Programmdateien ausgeführt wird unter Programmdateien funktionieren würde (x86) den Absturz verursacht. Aktualisieren der Maschine die 11G zu verwenden Client das Problem behoben, aber es gab auch einige verfügbaren Patches von metalink, die nicht direkt zur Verfügung stehen. was ist in Ihrem Fall seltsam ist, dass Sie keine Ausnahme, sondern das Verhalten der Bewegung die Anwendung in einen neuen Ordner erhalten behebt das Problem in einer ähnlichen Art und Weise, so dass es kann bezogen werden.

ORA-12154: TNS: konnte nicht die Verbindungskennung lösen angegeben oder ORA-6413: Verbindung nicht öffnen.

Nützliche Links http: / /blogs.msdn.com/debarchan/archive/2009/02/04/good-old-connectivity-issue.aspx

Details von Metalink unten.

Metalink Bug 3807408 Kann nicht extern authentifizieren Benutzer mit Zitat in username

Beschreibung Wenn ein extern authentifizierten Benutzernamen enthält, a ‚(‘, ‚)‘ oder ‚=‘ dann kann der Benutzer nicht authentifiziert werden. Zusätzlich, wenn ein Programmname / Pfad enthält diese Zeichen es kann nicht möglich sein, zu verbinden. z.B:   ": \ Program Files (x86) C" Windows-Clients in einem Verzeichnis installiert   nicht mit verbinden      ORA-12154: TNS: konnte die Verbindungskennung nicht lösen angegeben

Das Markenzeichen dieses Problem ist, dass die Netto-trace (Ebene 16) zeigt das Problem Zeichen / s durch ein „?“ ersetzt in der Spur.

Umgehung   Für das Authentifizierungsproblem:    Benutzernamen ändern,   oder    verwenden Sie keine Remote-OS-Authentifizierung für die Benutzer

Für das Verzeichnis / Programm Ausgabe:    ändern Sie das Programm / Verzeichnisname

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top