System.Data.OracleClient.dll在w2k8上崩溃了w3wp.exe

时间:2011-02-09 19:28:43

标签: asp.net-mvc oracle10g windows-server-2008 windbg

我正在使用Windbg来调试我们在Windows Server 2008,IIS7环境中的网站上发生的错误。我已将符号路径设置为“SRV * c:\ websymbols * http://msdl.microsoft.com/download/symbols

然后我浏览网站,将我带到登录页面。在那一刻,我将Windbg附加到w3wp.exe进程。然后,我将我的凭据输入登录页面并提交表单,这是给出问题的过程。然后我选择Windbg - >调试 - > Go Unhandled Exception,在控制台中输出以下内容:

ModLoad: 6d720000 6d835000   C:\Windows\assembly\NativeImages_v2.0.50727_32\System.Data.OracleC#\fb8da45f3873169a502db3cb492b25a0\System.Data.OracleClient.ni.dll  
ModLoad: 06a80000 06afb000   System.Data.OracleClient.dll  
ModLoad: 06b00000 06b7b000   System.Data.OracleClient.dll  
ModLoad: 06a80000 06afb000   C:\Windows\assembly\GAC_32  \System.Data.OracleClient\2.0.0.0__b77a5c561934e089\System.Data.OracleClient.dll
ModLoad: 06b80000 06be1000   C:\XEClient\bin\oci.dll  
ModLoad: 7c340000 7c396000   C:\Windows\system32\MSVCR71.dll  
ModLoad: 06c50000 09af9000   C:\XEClient\bin\OraOCIXE10.dll  
ModLoad: 739d0000 73a02000   C:\Windows\system32\WINMM.dll  
ModLoad: 73990000 739cd000   C:\Windows\system32\OLEACC.dll  
Critical error detected c0000374

之后我多次点击F10,直到打印到输出并调试器继续思考:

eax=05cbe288 ebx=00000000 ecx=76e47463 edx=05cbe025 esi=001a0000 edi=01fb3210  
eip=76ebfaf3 esp=05cbe274 ebp=05cbe2f0 iopl=0         nv up ei pl zr na pe nc  
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246  
ntdll!RtlReportCriticalFailure+0x56:
76ebfaf3 e89063fbff      call    ntdll!RtlRaiseException (76e75e88)  
0:023> p
(5b0.b5c): Unknown exception - code c0000374 (first chance)

调试器最终继续后,会将以下内容输出到控制台:

WARNING: Step/trace thread exited
eax=000000c0 ebx=00000000 ecx=00000400 edx=00000000 esi=04420000 edi=000005b0
eip=76e75e74 esp=05cbdd88 ebp=05cbde0c iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!KiFastSystemCallRet:
76e75e74 c3              ret

然后w3wp.exe死了。

我的问题是......如何获得有关错误的更多信息?我已经知道它与Oracle有关,因为如果我将以下内容放在global.asax Application_Start方法中,错误就会消失:

try{
new OracleConnection().ConnectionString = "anything";
}catch(Exception ex){
}

这段简单的代码修复了应用程序......难以置信,对吧?

提前致谢

更新时间:2011.02.09 15:46
Web应用程序在Windows XP和Linux中运行良好。 Windows Server 2003,IIS 5& 6.

Global.asax

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    Logger.LogMessage("Application_Start", "Started");
}

protected void Application_End()
{
    Logger.LogMessage("Application_End", "ended");  
} 

LoginController.cs

public ActionResult LogOn()
{
            string connString = "Data Source=IP:Port/Service;Persist Security Info=True;User ID=user; Password=user;Unicode=True";
            System.Data.OracleClient.OracleConnection dbConn = new System.Data.OracleClient.OracleConnection();
            dbConn.ConnectionString = connString;

            System.Data.OracleClient.OracleCommand dbComm = new System.Data.OracleClient.OracleCommand();
            dbComm.CommandText = "user.package.procedure";
            dbComm.CommandType = CommandType.StoredProcedure;
            dbComm.Connection = dbConn;
            dbComm.Parameters.Add("MyParam", System.Data.OracleClient.OracleType.Number);
            dbComm.Parameters["MyParam"].Value = DBNull.Value;


            System.Data.OracleClient.OracleDataAdapter dbAdap = new System.Data.OracleClient.OracleDataAdapter(dbComm);

            DataSet ds = new DataSet();

            try {
                Logger.LogMessage("TEST", "1");
                dbConn.Open();
                Logger.LogMessage("TEST", "2");
                dbAdap.Fill(ds);
                Logger.LogMessage("TEST", "3");
            } catch(Exception ex) {
                Logger.LogMessage("TEST", "4");
            } finally {
                Logger.LogMessage("TEST", "5");
                if(dbConn.State != ConnectionState.Closed) {
                    dbConn.Close();
                }
                dbConn.Dispose();
            }           
            return View();
}

现在好奇的是:你安装了网站。浏览它。你被带到登录页面。 w3wp.exe现已上线。输入凭证和提交表单。一切都好。您登录到该站点并开始浏览其页面。所有页面都有Oracle交互。

停止浏览。

停止浏览几分钟后,w3wp.exe就会死机。没关系。除非另有说明,否则必须发生。

再次浏览。你被带到登录页面,w3wp.exe再次上线。输入凭据并单击“提交”。执行“dbConn.Open();”行时代码停止

我在日志中看到的是:

  • Application_Start - 已开始
  • TEST - 1

大约1分钟后,我在日志中看到以下内容:

  • Application_Start - 已开始
  • TEST - 1

之后,应用程序只显示“Internet Explorer无法显示网页”页面。

Log没有显示“TEST - 4”导致catch没有显示global.asax方法的“Application_End - Ended”原因。

EventViewer没有帮助,因为它只说w3wp.exe失败了。

现在更加苛刻的事情。如果我在Application_Start方法中应用以下行,则应用程序可以运行:

try{ new System.Data.OracleClient.OracleConnection().ConnectionString = "anything"; }catch(Exception ex){ }

它抛出一个异常,说连接字符串格式无效。但应用程序工作。

我对Windbg的期望是什么?我希望它能给我一些我可以在谷歌浏览的内容然后谷歌带我去一些博客,其中一个人写道“你必须重新安装Oracle 10g”或类似的东西......

再次感谢。

2 个答案:

答案 0 :(得分:1)

看起来像是托管异常

诊断托管代码异常的步骤

  1. 附加到流程
  2. 为.NET 3.5发出命令.loadby sos mscorwks,使用.loadby sos clr
  3. 发布.NET 4.0
  4. 下一步发出命令sxe -c "!clrstack;!pe;KB" clr ;g
  5. 当存在托管异常并且为您提供托管/本机调用堆栈以及异常详细信息时,这将破坏调试器。

答案 1 :(得分:0)

我不知道你的意思是“w3wp.exe”死了。如果有任何IIS错误,你能在Windows事件日志中看到吗?

如果您不熟悉实时调试,

Debug Diag崩溃规则可以更好地捕获崩溃转储,

http://support.microsoft.com/kb/919789

分析崩溃转储是一种更清晰的崩溃问题。