Я использую Windbg для отладки ошибки, которая происходит на веб-сайте, который есть у нас в среде Windows Server 2008, IIS7. Я установил путь к символу "SRV * c: \ websymbols *http://msdl.microsoft.com/download/symbols"
Затем я просматриваю веб-сайт, который ведет меня на страницу входа. В этот момент я присоединяю Windbg к процессу w3wp.exe. Затем я ввожу свои учетные данные на странице входа в систему и отправляю форму, которая вызывает проблемы. Затем я выбираю Windbg -> Debug -> 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{<br>
new OracleConnection().ConnectionString = "anything";<br>
}catch(Exception ex){<br>
}
Эта простая строка кода исправляет приложение ... Невероятно, верно?
Заранее спасибо
ОБНОВЛЕНИЕ: 2011.02.09 15: 46
Веб-приложение работает нормально в Windows XP и 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 - запущен
- ТЕСТ - 1
Примерно через 1 минуту в журнале я вижу следующее:
- Application_Start - запущен
- ТЕСТ - 1
После этого приложение просто отображает страницу «Internet Explorer не может отобразить веб-страницу».
В журнале не указана причина перехвата "TEST - 4", а также не указана причина "Application_End - Ended" метода global.asax.
EventViewer не полезен, так как он говорит только о том, что w3wp.exe не удалось.
Теперь еще более смелая вещь. Если я применяю следующую строку в методе Application_Start, приложение работает:
try{
new System.Data.OracleClient.OracleConnection().ConnectionString = "anything";
}catch(Exception ex){
}
Выдает исключение, говорящее о том, что формат строки подключения недопустим. Но приложение работает.
Что я ожидаю от Windbg? Я ожидаю, что это даст мне что-то, что я могу просмотреть в Google, а затем Google приведет меня в какой-то блог, где парень написал, что «вы должны переустановить Oracle 10g» или что-то в этом роде ...
Еще раз спасибо.