Моя команда пытается найти, где появляется сообщение об ошибке в .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 нет данных, соответствующих формату с символами @
.
Product
(кому бы это ни принадлежало) или багом фреймворка. Хотя я не могу найти информацию оSystem.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse()
, но, как я уже сказал, я стараюсь держаться подальше от ASP/IIS/WebServices, насколько это возможно. ;) - person Bobby   schedule 22.12.2010ReadResponse
, чтобы увидеть, где именно может произойти исключение. В худшем случае ошибка исходит от собственного вызова и только «обернута» в это исключение, что не оставит вас ни с чем, кроме поддержки MS (что, имхо, ничего). Вы также можете дважды проверить конфигурацию всего. Это также может быть искаженный ответ SOAP, который вызывает бесконечный цикл или что-то в этом роде. - person Bobby   schedule 22.12.2010