Сбой приложения при обращении к оракулу, если путь к исполняемому файлу не содержит пробелов - PullRequest
2 голосов
/ 27 октября 2008

У нас проблема с x-файлами в нашем приложении .NET. Вернее, гибридное приложение Win32 и .NET.

Когда он пытается связаться с Oracle, он просто умирает. Пропадает. Идет к большой черной пустоте в небе. Нет сообщений в журнале событий, нет исключений, нет ничего.

Если вместо этого мы просто попросим приложение подключиться к серверу MS SQL, который заменяет использование OracleConnection и связанных классов на SqlConnection и связанные классы, он будет работать как положено.

Сегодня у нас был прорыв.

По какой-то причине заказчик понял, что, разместив все файлы приложения в каталоге на своем рабочем столе, он также работает, как и ожидалось, с Oracle. Перемещение каталога вниз к корню диска, или в C: \ Temp, или, ну, чуть-чуть, заставило сбой появиться снова.

По существу, это было на 100% воспроизводимо, если приложение работало при запуске из каталога на рабочем столе и не работало при запуске из каталога в корневом каталоге.

Сегодня мы выяснили, что разница была в том, был ли пробел в имени каталога или нет.

Итак, эти каталоги будут работать:

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

тогда как это не будет:

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

Я надеюсь, что кто-то, читающий это, видел подобное поведение и имел "ага, вам нужно вертеть лягушку на конфигурации драйвера oracle glitz" или подобное.

Любой


Followup # 1: Хорошо, я обработал вывод procmon сейчас, оба файла, когда я нажимаю кнопку, которая пытается открыть окно, которое вызывает сбой каскада, и я заметил, что они отслеживают в основном, есть небольшие различия в верхней части обоих файлов, и они отслеживают долгий путь вниз.

Однако, когда один прогон завершается неудачно, другой продолжает работать, и следующие несколько строк выходных данных журнала:

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

После этого рабочий прогон продолжает выполняться, а другой касается файлов mscorwks.dll несколько раз, прежде чем потоки закрываются и приложение закрывается. Таким образом, неудачный запуск не затрагивает вышеуказанные файлы.


Followup # 2: Думаю, я бы попытался обновить драйверы клиента oracle, но 10.2.0.1, очевидно, является самой высокой версией, доступной для сервера Windows 2003 и клиентов XP.


Последовательность # 3: Ну, мы закончили с решением черного ящика. В основном мы обнаружили, что проблема где-то связана с XPO и Oracle. XPO имеет системную таблицу, которой он управляет, которая называется XPObjectType, с тремя столбцами: Oid, TypeName и AssemblyName. Из-за того, как Oracle настроен в базах данных, с которыми мы говорим, имена столбцов были OID, TYPENAME и ASSEMBLYNAME. Обычно это не является проблемой, за исключением того, что XPO напрямую обращается к информации схемы и проверяет, существует ли таблица с правильными именами столбцов, а XPO не обрабатывает различия в регистре, поэтому он видит таблицу XPObjectType с тремя неизвестными столбцами и ни одного из них. из тех, кого он ожидает.

Что именно XPO делает сейчас, я не знаю, но если я отбросил эту таблицу и воссоздал ее с правильным регистром, используя двойные кавычки вокруг всех имен столбцов, чтобы получить правильный регистр, проблема не обрезается до.

Точно, где место в имени папки входит в это, я все еще понятия не имею, но у этой проблемы было два уровня:

  1. Остановите сбой приложения у наших клиентов, краткосрочное решение
  2. Исправить ошибку, долгосрочное решение

В настоящее время уровень 1 решен, уровень 2 будет помещен обратно в очередь на данный момент и имеет приоритет. В любом случае, мы сталкиваемся с некоторыми более значительными изменениями в нашем уровне данных, так что это может и не быть проблемой, которую нам нужно решать, по крайней мере, если все наши клиенты Oracle проверят, что исправление таблицы действительно устраняет эту проблему.

Я приму ответ от Дейва Маркла , поскольку хотя Process Monitor (старший брат File Monitor) на самом деле не определил проблему, я смог использовать его, чтобы определить, что после моей точки останова в коде пользователя, в котором XPO создал запрос для этой таблицы, ввода-вывода не происходило до тех пор, пока все записи для закрытия приложения не были зарегистрированы, что заставило меня поверить, что именно эта таблица была виновником или, по крайней мере, повлияла проблема как-то.

Если мне удастся выяснить истинную причину этого, я обновлю сообщение.

Ответы [ 4 ]

3 голосов
/ 27 октября 2008

Вот что я бы сделал. Во-первых, TRIPLE-проверьте, что вы видите поведение, которое, как вы думаете, вы видите. Я могу видеть, что это происходит наоборот, не используя System.IO.Path для объединения путей, но не так, как вы это видите. Тройная проверка правильности прав доступа к файлу.

Затем скачайте Filemon от MS и посмотрите, что происходит в файловой системе, когда ваша программа попадает в эти проблемные места. Вы можете отфильтровать определенные операции с файлами (например, удалить антивирусную активность), чтобы все выглядело чище, пока вы делаете это. Ищите ошибки доступа к файлу, используя FileMon как для случая успеха, так и для случая ошибки для вашей программы. Это должно указать вам, к какому файлу обращаются и что вызывает проблему. Например, если вы видите ошибку FILE_NOT_FOUND при доступе к бессмысленному имени файла, вы можете быть уверены, что вы или поставщик делаете что-то не так, что может привести к вашей проблеме ...

1 голос
/ 27 октября 2008

Вероятно, вы должны увидеть, можете ли вы воспроизвести проблему с помощью простого приложения, которое только пытается открыть соединение с Oracle. Таким образом, вы можете быть на 100% уверены, что проблема связана с OracleConnection или драйвером Oracle, а не с вашим собственным кодом.

0 голосов
/ 05 мая 2010

Я подозреваю, что клиент-оракул честен. Была проблема, которая была похожа на разочаровывающую природу.

Если бы мы установили на 64-битных машинах клиент остановился бы при запуске при подключении к oracle, даже если приложение 32-битное. В конечном итоге мы выяснили, что у определенного клиента Oracle (в Ora 10 возникла проблема с скобками в пути, поэтому программа, работающая с файлами программы, работала с файлами программы (x86), вызвала сбой. клиент исправил проблему, но были также некоторые исправления, доступные от metalink, которые не доступны напрямую. Что странно в вашем случае, это то, что вы не получаете никаких исключений, но поведение перемещения приложения в новую папку устраняет проблему аналогичным образом может быть связано.

ORA-12154: TNS: не удалось разрешить указанный идентификатор подключения или же ORA-6413: Соединение не открыто.

Полезные ссылки http://blogs.msdn.com/debarchan/archive/2009/02/04/good-old-connectivity-issue.aspx

Подробности от Металинк ниже.

Metalink Bug 3807408 Невозможно внешняя аутентификация пользователя с цитатой в имени пользователя

Описание Если внешне аутентифицированное имя пользователя содержит '(', ')' или '=' тогда пользователь не может быть аутентифицирован. Кроме того, если имя программы / путь содержит эти символы, может быть невозможно подключиться. например: Клиенты Windows, установленные в каталоге «C: \ Program Files (x86)» не удается связаться с ORA-12154: TNS: не удалось разрешить указанный идентификатор подключения

Отличительной чертой этой проблемы является то, что сетевой след (уровень 16) показывает проблемный символ / ы заменены на «?» в след.

Обход Для проблемы аутентификации: Изменение имени пользователя, или же не используйте удаленную аутентификацию ОС для этих пользователей

Для выпуска программы / каталога: изменить имя программы / каталога

0 голосов
/ 18 сентября 2009

За это вы должны получить медаль за настойчивость!

"Что именно XPO делает сейчас, я не действительно знаю, но если бы я бросил это стол, и воссоздали его с правым случай, используя двойные кавычки вокруг всех имена столбцов, чтобы получить случай Да, проблема не возникает.

Точно, где место в папке имя входит в это, у меня до сих пор нет Идея "

Проблемы с пробелами в именах заключаются в том, что они обычно интерпретируют бит перед пробелом как имя, а остальные - как параметр. Если это так, то с простым именем он может видеть «C \ Temp», и это каталог. С разделенным именем он получает «C: \ Program Files», ищет «C: \ Program», а его не существует. Например, не удастся перезаписать «C: \ Temp», но удастся написать «C: \ Program». Вам интересно, будет ли он все равно работать с C: \ Program Files, если существует файл или каталог с именем "C: \ Program"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...