System.Data.OracleClient.dll вылетает w3wp.exe на w2k8 - PullRequest
0 голосов
/ 09 февраля 2011

Я использую 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» или что-то в этом роде ...

Еще раз спасибо.

Ответы [ 2 ]

1 голос
/ 09 февраля 2011

Похоже на управляемое исключение

Действия по диагностике управляемого кода Исключение

  1. Присоединение к процессу
  2. Выполнение команды .loadby sos mscorwks для до .NET3.5 и для .NET 4.0 используйте .loadby sos clr
  3. Далее Выполните команду sxe -c "!clrstack;!pe;KB" clr ;g

Это приведет к поломке отладчика при наличии управляемого исключения и предоставит вам управляемый / собственныйстек вызовов, а также сведения об исключениях.

0 голосов
/ 13 февраля 2011

Я не знаю, что вы подразумеваете под "w3wp.exe" умирает. Можете ли вы увидеть в журнале событий Windows, есть ли какая-либо ошибка IIS?

Правило сбоя отладки Diag может быть лучшим способом сбора дампов сбоя, если вы не знакомы с оперативной отладкой,

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

Анализ аварийных дампов - более понятный подход к проблемам аварий.

...