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

Отладка "Недостаточно памяти для обработки этой команды"

Мы начали испытывать Not enough storage available to process this command. Приложение WPF, исключение начинает появляться после нескольких часов работы в обычном режиме.

System.ComponentModel.Win32Exception (0x80004005): Not enough storage is available to process this command
   at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d)
   at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
   at System.Windows.Interop.HwndSource.Initialize(HwndSourceParameters parameters)
   at System.Windows.Window.CreateSourceWindow(Boolean duringShow)
   at System.Windows.Window.CreateSourceWindowDuringShow()
   at System.Windows.Window.SafeCreateWindowDuringShow()
   at System.Windows.Window.ShowHelper(Object booleanBox)
   at System.Windows.Window.Show()
   at System.Windows.Window.ShowDialog()

Мое понимание - это какое-то исключение из памяти, специфичное для выделения windows resources. Какова возможная причина этого и как его отладить?


Обновить

Я рассмотрел тему, предложенную @Thili77 (this one). Я использовал GDIView и диспетчер задач для поиска обработанных ручек во время выполнения нашего приложения (Handles, USER Objects и GDI objects в taskmgr), и похоже, что они не растут. Мой следующий тест - попытаться запустить его в течение дня без VS (ранее он выполнялся в процессе VS VS) и проверить, все ли это происходит. Я все еще ищу любые советы или советы, если у кого-нибудь есть

Обновление # 2 Это происходит на новом чистом ПК без хостинга VS. Ручки, объекты USER и объекты GDI в порядке сбоя. Когда ПК в аварийном состоянии ничего не работает, похоже, что ручки действительно просочились, но ProcMon не показывает большие числа для этих значений. Также странно, что это всегда происходит около 7-8 часов вечера, когда в офисе нет никого, и это не имеет значения, когда я запускал приложение. Это уже третья катастрофа. Совпадение? Единственное, что я заметил, что я нахожу странным, - это большое количество ошибок страницы для приложения, которое постоянно растет. Может ли это быть связано? Больше не отображается, см. "Обновление № 3"

Обновление # 3

Далее приведены сведения об аварии, которую я испытываю. Система - x86, приложение - x86, W7 SP1. Текущее состояние, показанное на скриншотах, находится прямо после аварии, а windbg приостанавливает процесс. По какой-то причине в настоящее время исключение имеет другое сообщение: The operation completed successfully. Но это все тот же Win32Exception, исходящий из одного и того же фрагмента кода.

Мне также нужно указать, что я работаю с уменьшенным количеством кучи рабочего стола и с опциями AppAnalyzer Basic - для того, чтобы сделать ошибку более частым (что, похоже, работает). Предположение о времени было действительно совпадением, и времени, связанного с общей темой, больше не было. Информация о системе Процессы Информация о процессе MyApp

4b9b3361

Ответ 1

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

Если это окажется виновником, одна из возможных причин заключается в том, что приложение не закрывает экземпляры Window. HwndWrapper очищает свой глобальный атом в своем Dispose, что происходит в ответ на WM_DESTROY, что происходит в ответ на вызов Закрыть в окне (или установить DialogResult, который заканчивает закрытие окна если значение изменилось, и окно было показано путем вызова ShowDialog, а не Show). Могут быть и другие возможные причины утечки атома.

P.S. Причина, по которой я подозреваю, заключается в том, что "Недостаточно памяти для обработки этой команды" - это ошибка, которая возвращается, когда RegisterClassEx не может добавить в глобальную таблицу атомов.

Ответ 2

Похож на проблему, которая не была специально решена Microsoft, отметьте эту ссылку Connect, в которой было указано:

Мы ценим обратную связь. Однако эта проблема не будет рассмотрена в следующей версии WPF. Спасибо. -WPF.

Предоставляется обходное решение, это может помочь:

Вы можете обойти эту ошибку, добавив следующий код в поток:

Dispatcher dispatcher = Dispatcher.CurrentDispatcher;
dispatcher.BeginInvokeShutdown(DispatcherPriority.Normal);
Dispatcher.Run();

Это просит диспетчера, связанного с потоком, немедленно закрыть его.

Ответ 3

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

Чтобы отладить, вам может понадобиться найти ваш поток 1 (который является пользовательским интерфейсом) в VS во время сеанса отладки и отслеживать его действия. Возможно, на каком-то внешнем событии есть какой-то бесконечный официант.