Разберите .NET IL, чтобы найти сообщение об ошибке

Моя команда пытается найти, где появляется сообщение об ошибке в .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 нет данных, соответствующих формату с символами @.


person George Johnston    schedule 22.12.2010    source источник
comment
Вы можете попробовать найти его с помощью Redgates Reflector и Разобрать надстройку. В противном случае я боюсь, что мы мало что сможем для вас сделать, за исключением того, что вы предоставите нам файл и трассировку стека... что, скорее всего, не произойдет, я думаю.   -  person Bobby    schedule 22.12.2010
comment
Спасибо, Бобби. Я намеренно оставляю наше сообщение об ошибке и продукт, чтобы не нарушать законность Microsoft. знак равно   -  person George Johnston    schedule 22.12.2010
comment
И последняя мысль: последняя или первая строка в трассировке стека является вашим методом? Если это первое, исключение исходит из вашего собственного приложения, если оно последнее, оно находится в их приложении.   -  person Bobby    schedule 22.12.2010
comment
Последний вызов в трассировке стека — это вызов нашего метода. Это код Microsoft вызывает вас? или наоборот?   -  person Dlongnecker    schedule 22.12.2010
comment
@Bobby, если это не ошибка самого фреймворка?   -  person Dlongnecker    schedule 22.12.2010
comment
Мы вызываем метод Microsoft вне нашего приложения. Ошибка возвращается как SoapException. Их код не выдает ошибку и не регистрирует ее — кажется, что она обрабатывается и передается обратно в наше приложение, где она выдается.   -  person George Johnston    schedule 22.12.2010
comment
@George: Не могли бы вы предоставить нам замаскированную / затемненную трассировку стека (имена приложений заменены и т. Д.) И сообщение об ошибке?   -  person Bobby    schedule 22.12.2010
comment
@Ziplin: Это, конечно, может быть, но кто-то должен «спровоцировать» это исключение, и на данный момент вопрос в том, является ли это приложением MS или их собственным. Если только он не нашел ошибку в фреймворке...   -  person Bobby    schedule 22.12.2010
comment
@Bobby Я добавил трассировку стека и сообщение об ошибке.   -  person George Johnston    schedule 22.12.2010
comment
@George: извините, у меня нет опыта работы с веб-сервисами, поэтому я ухожу. Но это немного попахивает неправильной настройкой Product (кому бы это ни принадлежало) или багом фреймворка. Хотя я не могу найти информацию о System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(), но, как я уже сказал, я стараюсь держаться подальше от ASP/IIS/WebServices, насколько это возможно. ;)   -  person Bobby    schedule 22.12.2010
comment
@Bobby Это не относится к ASP.NET - только .NET и IL, где я хочу найти сообщение об ошибке. Я был бы рад узнать, что сообщение об ошибке находится на нашей стороне, но, к сожалению, оно выглядит иначе, поскольку оно возникает в разных приложениях, вызывающих одну и ту же службу с совершенно разными базами кода. Тем не менее, я ценю вашу помощь :)   -  person George Johnston    schedule 22.12.2010
comment
@George: Как я уже сказал, вы можете использовать Reflector, чтобы заглянуть внутрь приложения и даже покопаться в ReadResponse, чтобы увидеть, где именно может произойти исключение. В худшем случае ошибка исходит от собственного вызова и только «обернута» в это исключение, что не оставит вас ни с чем, кроме поддержки MS (что, имхо, ничего). Вы также можете дважды проверить конфигурацию всего. Это также может быть искаженный ответ SOAP, который вызывает бесконечный цикл или что-то в этом роде.   -  person Bobby    schedule 22.12.2010
comment
Вы можете попробовать использовать Fiddler или Wireshark для непосредственного наблюдения за SOAP-трафиком.   -  person    schedule 22.12.2010


Ответы (3)


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

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

person Hans Passant    schedule 22.12.2010

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

person SK-logic    schedule 22.12.2010
comment
@SK Мы попытались сделать обратное, чтобы воспроизвести ошибку, уменьшив резерв стека .exe, в котором запущен этот процесс. До того, как мы изменили размер стека, он был установлен на 1 МБ. После дросселирования стека до 768 КБ процесс все еще будет работать, но мы получим другие ошибки — не упомянутую выше ошибку. Мы все еще тестируем это возможное решение. Спасибо. - person George Johnston; 22.12.2010

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

person Joshua    schedule 22.12.2010