Разберите .NET IL, чтобы найти сообщение об ошибке - PullRequest
7 голосов
/ 22 декабря 2010

Моя команда пытается выяснить, где в .NET windows service происходит сообщение об ошибке, инкапсулирующее веб-службу, созданную Microsoft и расположенную на наших серверах, для поддержки используемого нами бизнес-продукта.Microsoft лично сказала нам, что ошибка, которую мы получаем, на самом деле является одной из их ошибок, однако они не могут определить, где и почему она происходит.Это критически важный бизнес-процесс, который вызывает у нашей команды сильную душевную боль.

Эта ошибка возникает, насколько мы можем судить, случайным образом и не имеет никаких признаков, которые мы можем обнаружить, просматривая следы стека.Последний вызов в трассировке стека - это наш вызов метода, пытающийся прочитать ответ от службы, который не дает нам подсказки, где или почему происходит ошибка в вызове метода для службы.Служба Microsoft Windows не регистрирует какие-либо ошибки в средстве просмотра событий.

Мы хотели бы отследить, откуда происходит эта ошибка, выполняя поиск буквенной строки сообщения об ошибке.Если мы сможем идентифицировать вызов метода, генерирующий эту ошибку, мы сможем быть на шаг ближе к тому, чтобы сузить способы ее устранения.

Хотя у нас нет доступа к исходному коду этой службы, мы можем, однако,просмотреть IL, используя дизассемблер IL (idlasm.exe).Я сбросил IL для нескольких сборок, но они не являются литеральными строками.

Можно ли найти литеральную строку в IL?Я предполагаю, что это закодировано - я просто не знаю достаточно о IL, чтобы определить, где искать или как идентифицировать строку в IL.Если он не существует в виде литеральной строки с методом в IL и хранится в ресурсе, где еще можно найти сообщение об ошибке?

Трассировка стека с заменой имен приложений.

Raw Error:  There is insufficient memory to execute this function.
This can be caused by recursive function calls. Contact your system administrator.

at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)   
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at Product.DoSomething() in c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\da35f853\f48bba34\App_WebReferences.jygjwt-a.0.cs:line 701
at Product.DoSomething() in E:\Sites\Example.com\App_Code\File.vb:line 1105
at ASP.shop_checkout_aspx.ProcessCheckout() in E:\Sites\Example.com\processcheckout.aspx:line 546

Несколько замечаний о том, что на момент появления этого сообщения об ошибке имеется достаточно памяти, и при возникновении этой ошибки каждый последующий вызов любого метода возвращает ту же ошибку.Это только спадет при перезапуске служб Microsoft.

Мы сузили каждый отдельный вызов службам, используемым нашим сайтом, но не можем воспроизвести это сообщение.Мы можем перегрузить службу в разработке примерно в 1000 раз больше трафика, как это видно в работе, и вызвать исключение нехватки памяти (из-за использования всей памяти), но не сообщение, в котором говорится: «Can be вызвано рекурсивным вызовом функции«.Agian, о котором Microsoft заявляет, является уникальной ошибкой, которую специально генерирует их продукт.

Обновление

Нам удалось найти буквальное сообщение об ошибке в файле .etx,что выглядит следующим образом:

//   ÚÄÄÄÄÄÄÄÄÄ¿
// ÚÄ´  STACK  ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
// ³ ÀÄÄÄÄÄÄÄÄÄÙ                                                              ³
// ³                                                                          ³
// ³  Stack Manager                                                           ³
// ³                                                                          ³
// ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
@1@15@0@
@2@1@0@
There is insufficient memory to execute this function.

This can be caused by recursive function calls that are used in the program. Contact your system administrator.
@2@END@0@

Я предполагаю, что @1@15@0@, @2@1@0@ и @2@END@0@ - это некая ссылка, которую сборки используют для ссылки на эти строки.У кого-нибудь есть какая-либо информация о том, как связать их обратно с одной из сборок, которые используют эти строки?Пока что в дампах IL нет данных, соответствующих формату с символами @.

Ответы [ 3 ]

2 голосов
/ 22 декабря 2010

Скорее всего, вам нужно посмотреть на другом конце провода для поиска источника исключения.Не забывайте, вы используете мыло.Свойство SoapMessage.Exception вызывается внутри SoapHttpClientProtocol.ReadResponse (), когда оно не равно нулю.

Текст исключения указывает на так называемое переполнение мягкого стека.Код исключения Windows 0xe053534f (хорошо гуглится), выдаваемый при обнаружении кода взаимодействия, не хватает места в стеке для запуска функции без жесткого переполнения стека.

0 голосов
/ 22 декабря 2010

Это исключение StackOverflowException. Отсутствующая трассировка стека на стороне сервера в вызове SOAP - это пустая раздача.

0 голосов
/ 22 декабря 2010

А пока вы можете просто увеличить размер стека для своего работника IIS, w3wp.exe (используя editbin).Размер стека по умолчанию очень мал.

...