Исключение нехватки памяти в WinForms - PullRequest
1 голос
/ 01 сентября 2011

Я создал приложение TaskBar в Visual Studio, которое минимизирует себя в системном трее и показывает уведомления пользователю на основе изменения базы данных.Всякий раз, когда пользователю назначается новая задача, он уведомляется в системном трее, как всплывающее окно.Но всякий раз, когда приложения выполняются в среднем в течение 15 часов, мои приложения внезапно вылетают и выдают исключение нехватки памяти.Итак, у меня есть несколько вопросов, пожалуйста, ответьте на них.

  1. Как я могу отладить эту проблему?Я не могу ждать 15 часов и проверить эту проблему?
  2. Есть ли какой-либо инструмент для проверки утечки памяти моего приложения, который может напрямую указать на мою проблему?
  3. Как я могугенерировать из памяти исключение для моей программы, чтобы его можно было легко и быстро отладить?
  4. Что я должен сделать, чтобы избежать утечки памяти в моем коде?

Изображение моего приложения: enter image description here

Ответы [ 2 ]

7 голосов
/ 01 сентября 2011

В ответ на ваши 4 вопроса:

1: вы можете перехватить событие My.Application.Startup , чтобы добавить код обработки исключений.Обратите внимание, что код для обработчика события Startup хранится в файле ApplicationEvents.vb, который по умолчанию скрыт.Вот код C # (почти идентичный в VB), который настроит ваши обработчики исключений:

// Event handler for handling UI thread exceptions.
Application.ThreadException += 
    new ThreadExceptionEventHandler(App_UiThreadException);

// Force all Windows Forms errors to go through our handler.
// NB In .NET 4, this doesn't apply when the process state is corrupted.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

// Event handler for handling non-UI thread exceptions. 
AppDomain.CurrentDomain.UnhandledException += new 
    UnhandledExceptionEventHandler(App_NonUiThreadException);

// Run the application.

2: Вы можете использовать бесплатный CLR Profiler для проверки использования памяти.

3: Вы можете сами вызвать исключение OutOfMemory , если хотите посмотреть, как ваша программа справится с этим.

4: Одним из полезных ресурсов является Отладка утечки приложений .Еще один Определить утечки памяти CLR .

2 голосов
/ 01 сентября 2011

Вы можете проверить трассировку стека следующим образом (опубликован как ответ, чтобы он правильно отформатировал):

Try
    Dim s As String = "1234".Substring(3, 5) 'some code that throws an exception
Catch ex As Exception
    MsgBox("Error: " + ex.Message + vbCrLf + vbCrLf + "Stack Trace: " + ex.StackTrace, MsgBoxStyle.Exclamation)
End Try
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...