【问题标题】:Application crashing when talking to oracle unless executable path contains spaces与 oracle 通信时应用程序崩溃,除非可执行路径包含空格
【发布时间】:2008-10-27 11:37:35
【问题描述】:

我们的 .NET 应用程序存在 x 文件问题。或者,更确切地说,混合 Win32 和 .NET 应用程序。

当它尝试与 Oracle 通信时,它就死了。消失。向着天空中的黑色大虚空而去。没有事件日志消息,没有异常,没有任何东西。

如果我们只是要求应用程序与 MS SQL Server 对话,其效果是将 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 驱动程序配置上调整 frob”或类似的东西。

有人吗?


跟进 #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 文件几次。因此,失败的运行不会触及上述文件。


后续 #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 客户都验证表修复确实解决了问题的话。

我会接受Dave Markle 的回答,因为尽管 Process Monitor(文件监视器的老大哥)实际上并没有查明问题,但我能够使用它来确定在用户代码中的断点之后XPO 已经为这个表建立了查询,直到应用程序关闭的所有条目都被记录后才发生 I/O,这让我相信这个表是罪魁祸首,或者至少以某种方式影响了问题。

如果我能找到真正的原因,我会更新帖子。

【问题讨论】:

    标签: .net oracle crash directory


    【解决方案1】:

    这就是我要做的。首先,三重检查您是否看到了您认为您正在看到的行为。通过不使用 System.IO.Path 连接路径,我可以看到这种情况发生了相反的情况,但不像你看到的那样。三重检查文件权限是否有意义。

    接下来,从 MS 下载 Filemon 并观察文件系统上发生的情况,因为您的程序遇到了这些问题。您可以过滤掉特定的文件活动(例如,删除您的防病毒文件活动),以使您在执行此操作时看起来更干净。使用 FileMon 查找程序的成功案例和错误案例的文件访问错误。这应该指出您正在访问哪个文件并导致问题。例如,如果您在访问无意义的文件名时看到 FILE_NOT_FOUND 错误,则可以确定您或供应商做错了什么,可能导致您的问题...

    【讨论】:

    • 我已经检查了四次。将所有文件放在 C:\Temp 中,它就会崩溃。将目录重命名为“Temp”,它可以工作。我会试试 filemon。
    • 哇。这很奇怪。让我们知道您使用 Filemon 发现了什么。
    • 会的。只是为了确保我已经说得够清楚了。 唯一的 区别 是重命名目录并重新运行应用程序,仍然具有相同的配置和数据库连接。我现在已经运行 FileMon,正在过滤文件以进行比较。
    • 真的很奇怪。您在 FileMon 中根本没有收到任何文件 I/O 错误吗?
    • 无,当它工作时(文件夹名称中的空格)和失败时(无空格)的日志不是 100% 等于一个失败而另一个没有,但是由于登录期间的一些后台处理,看起来这可能只是时间问题。问题已更新。
    【解决方案2】:

    您可能应该看看是否可以使用仅尝试打开与 Oracle 的连接的简单应用程序来重现该问题。这样您就可以 100% 确定问题出在 OracleConnection 或 Oracle 驱动程序上,而不是您自己的代码上。

    【讨论】:

      【解决方案3】:

      你应该为此获得一个坚持不懈的奖章!

      “XPO 现在做什么,我不知道 真的知道,但如果我放弃了这个 表,并用权利重新创建它 大小写,全部使用双引号 获取案例的列名 对,问题没有出现。

      文件夹中空间的确切位置 名字出现在这,我还是没有 想法”

      我在名称中使用空格时遇到的问题是,它们通常将空格前的位解释为名称,将其余位解释为参数。如果是这种情况,那么使用纯名称它可以看到“C\Temp”并且它是一个目录。使用带间隔的名称,它会获取“C:\Program Files”,查找“C:\Program”,但它不存在。例如,覆盖“C:\Temp”会失败,但会成功写入“C:\Program”。 想知道如果有一个名为“C:\Program”的文件或目录,它是否仍然会因“C:\Program Files”而失败

      【讨论】:

        【解决方案4】:

        我怀疑预言机客户端是诚实的。有一个令人沮丧的性质相似的问题。

        如果我们安装在 64 位机器上,即使应用程序是 32 位,客户端在连接到 oracle 时也会在启动时停止。我们最终追查到某个 oracle 客户端(Ora 10 路径中的括号有问题,因此在程序文件下运行的程序将在程序文件(x86)下运行的程序导致崩溃。更新机器以使用 11G客户端解决了这个问题,但也有一些来自metalink的补丁不是直接可用的。在你的情况下奇怪的是你没有例外,但是将应用程序移动到新文件夹的行为以类似的方式解决了这个问题,所以它可能是相关的。

        ORA-12154: TNS: 无法解析指定的连接标识符 要么 ORA-6413: 连接未打开。

        有用的链接http://blogs.msdn.com/debarchan/archive/2009/02/04/good-old-connectivity-issue.aspx

        详情来自以下Metalink。

        Metalink 错误 3807408 无法在用户名中使用引号对用户进行外部身份验证

        说明 如果外部验证的用户名包含 '(',')' 或 '=' 那么用户无法通过身份验证。 此外,如果程序名称/路径包含这些字符,它 可能无法连接。 例如: 安装在目录“C:\Program Files (x86)”中的 Windows 客户端 无法连接 ORA-12154: TNS: 无法解析指定的连接标识符

        这个问题的特点是网络跟踪(16 级)显示 问题字符替换为“?”在跟踪中。

        解决方法 对于身份验证问题: 更改用户名, 要么 不要对这些用户使用远程操作系统身份验证

        对于程序/目录问题: 更改程序/目录名称

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-02-25
          • 2012-07-21
          • 1970-01-01
          • 1970-01-01
          • 2011-01-29
          • 2016-11-27
          • 1970-01-01
          相关资源
          最近更新 更多