【发布时间】: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 层将暂时放回队列并优先处理。无论如何,我们的数据层面临着一些更大的变化,所以这可能不是我们需要解决的问题,至少如果我们所有的 Oracle 客户都验证表修复确实解决了问题的话。
我会接受Dave Markle 的回答,因为尽管 Process Monitor(文件监视器的老大哥)实际上并没有查明问题,但我能够使用它来确定在用户代码中的断点之后XPO 已经为这个表建立了查询,直到应用程序关闭的所有条目都被记录后才发生 I/O,这让我相信这个表是罪魁祸首,或者至少以某种方式影响了问题。
如果我能找到真正的原因,我会更新帖子。
【问题讨论】:
标签: .net oracle crash directory