Подтвердить что ты не робот

Silverlight 5 - отладка npctrl.dll сбой

Я получаю действительно разочаровывающий сбой плагина Silverlight, который влияет как на IE, так и на firefox.

Ошибка журнала событий:

Faulting application name: iexplore.exe, version: 9.0.8112.16421, time stamp: 0x4d76255d
Faulting module name: npctrl.dll, version: 5.0.61118.0, time stamp: 0x4ec5fc64
Exception code: 0xc0000094
Fault offset: 0x0001d720
Faulting process id: 0x434
Faulting application start time: 0x01ccf0b878b55ca7
Faulting application path: C:\Program Files (x86)\Internet Explorer\iexplore.exe
Faulting module path: c:\Program Files (x86)\Microsoft Silverlight\5.0.61118.0\npctrl.dll
Report Id: bd79af3d-5cab-11e1-8948-000c29de3e25

Я дошел до добавления WinDbg во время исключения, чтобы получить немного больше информации:

(17e4.13f8): Break instruction exception - code 80000003 (first chance)
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Windows\SYSTEM32\ntdll.dll - 
ntdll!DbgBreakPoint:
00000000`77810530 cc              int     3
0:029> g
(17e4.1790): Integer divide-by-zero - code c0000094 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for NPCTRL.dll     - 
NPCTRL+0x1d720:
7b59d720 f7f1            div     eax,ecx

Хорошо, поэтому ntdll.dll делит на ноль. Я действительно не знаю, как я могу отлаживать дальше. Я пробовал просмотреть некоторые статьи, которые объясняют, как это сделать, но я думаю, что я ограничен в зависимости от того, что для ntdll.dll нет символов?

Как я могу сузить, какая часть моего кода приводит к этой ошибке?

4b9b3361

Ответ 1

После нескольких часов отладки я смог реплицировать проблему в небольшом проекте. Просто создайте веб-службу с поддержкой Silverlight и обратитесь к ней. Затем перейдите к использованию http-клиента клиента:

WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);

Вызов службы на моей машине (и коллеги также) имеет примерно 10-15% вероятности сбой с ошибкой ntdll.dll.

Я нашел два способа смягчить эту проблему.

1) Прекратите использовать сетевой стек клиента. Проблема никогда не возникает со стеком браузера

2) Войдите в приложение Silverlight за пределами VMWare. Проблема, похоже, происходит только внутри виртуальной машины. Спасибо RobSiklos за это.

Надеюсь, это поможет кому-то.

Ответ 2

Установите виртуальную машину Vmware для использования только одного процессора, и проблема не будет воспроизводиться. Сверху экрана Виртуальная машинa > Параметры виртуальной машины > Процессоры → Количество процессорных ядер = 1.

Ответ 3

Вы работаете внутри виртуальной машины vmware? См. Здесь: http://communities.vmware.com/thread/394306?tstart=0

ОБНОВЛЕНИЕ (2013-03-15): По последнему сообщению в теме форума, связанной выше, кажется, Microsoft наконец-то исправила эту проблему.

Ответ 4

Эти команды Windbg будут загружать символы для ntdll.dll(и других модулей Microsoft) с сервера символов Microsoft.

.symfix

.reload/f

Ответ 5

Если вы используете приложение silverlight на виртуальной машине, вы можете попробовать это, если действительно будете в отчаянии и должны заставить его работать.

Если вы используете приложение Silverlight и поставщик данных на том же веб-сайте или в том же процессе, попробуйте разбить их. Позвольте мне объяснить...

В моем приложении было три варианта: (1) ПОДКЛЮЧЕНИЕ DIRECT DATABASE (не применимо здесь), (2) WEB-СЕРВИС или (3) страница HTTP aspx.

Всякий раз, когда я использовал опции 2 и 3, но вызывал провайдера из одного и того же сайта, приложение быстро сработало. Однако я заметил, что когда я вызываю тот же (или другой) веб-сервис, размещенный в другом домене (кросс-домены), он не сбой.

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

Я также получил ошибку "деление на ноль", но именно так я ее решил. Итак, тот же код, то же самое, за исключением того, что приложение silverlight и его размещенный веб-сайт используют другой веб-сайт или веб-службу в качестве источника данных (даже если этот веб-сайт источника данных находился на одной и той же виртуальной машине).

Это имеет смысл?

Итак, приложение S/L, работающее в http://localhost/app.aspx, использует службу WCF, запущенную в https://itisqa-d1/folder1/service1.svc. И в этом случае itisqa-d1 и localhost могут быть или не быть одной и той же машиной, если они работают в отдельных доменах приложений или пулах.