Приложение Winforms вылетает

Я разрабатываю приложение на Visual C# с помощью winforms.

Приложение представляет собой экран с тремя вкладками. Он показывает значения процессов, запущенных в системе в секунду (используя System.Diagnostics.Process[] ).

Он генерирует и обновляет множество чисел и вычислений (около 4000 в секунду). Но после 10000 итераций или примерно 45 минут работы он просто падает, и самое удивительное то, что он всегда падает примерно в одно и то же время.

Задействованная здесь оперативная память составляет всего 70 МБ, а загрузка ЦП никогда не превышает 35% для приложения под Windows XP и Windows 7. Цель приложения — позволить пользователям просматривать процессы, запущенные в системе, с загрузкой ЦП и памяти. мы не можем предложить диспетчер задач из соображений безопасности.

Ошибка не перехватывается C# ни одним из методов try - catch

Следующие экраны являются образцом, который следует после сбоя

введите здесь описание изображения

Главный экран приложения выглядит так

введите здесь описание изображения

Кто-нибудь сталкивался с такой ситуацией, когда приложение вылетает после фиксированной длины запуска.

Пожалуйста, предложите диагностический инструмент или способ перехвата таких ошибок.

Спасибо за ответы


person arvind    schedule 20.07.2012    source источник
comment
Вы проверяли наличие утечек памяти? и есть ли у вас код smaple?   -  person JohnnBlade    schedule 20.07.2012
comment
это просто таймер, который запускает бесконечный цикл, который получает все процессы и показывает их в сетке. как сделать {Process[] plist = Process.GetProcesses(); } пока (истина); Утечка памяти (даже большие приложения работают нормально, плюс всегда происходит сбой после фиксированного запуска). Кстати, ваш блог на WordPress хорош.   -  person arvind    schedule 20.07.2012
comment
С таймером вы не имеете в виду объект таймера, вы пытались использовать объект таймера вместо использования бесконечного цикла. Спасибо, я стараюсь обновлять свой блог как можно чаще.   -  person JohnnBlade    schedule 20.07.2012
comment
и вы также используете потоки, например фоновый рабочий   -  person JohnnBlade    schedule 20.07.2012
comment
Трудно сказать, в чем причина. если он падает после конкретной итерации, то это может быть какой-то индекс массива или что-то в этом роде. вставьте часть кода, который, по вашему мнению, может быть проблемой, особенно ваш более быстрый код   -  person Saeid Yazdani    schedule 20.07.2012
comment
То же самое происходит, когда у вас подключен отладчик?   -  person leppie    schedule 20.07.2012
comment
blogs.msdn.com/b/lexli/archive/2009/08/23/   -  person Lex Li    schedule 20.07.2012
comment
ссылка, упомянутая выше, была изменена на microsoft.com/en-us /download/details.aspx?id=26798   -  person arvind    schedule 20.07.2012


Ответы (2)


Попробуйте добавить это в свой сервис в основной пустоте

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

        public static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            // do your logging here, write to a file, or send an email
        }

а также

service.ExceptionThrown += service_ExceptionThrown;

        private static void service_ExceptionThrown(object sender, ExceptionThrownEventArgs e)
        {
            // do your logging here, write to a file, or send an email
        }

и если вы хотите отлаживать свою службу в Visual Studio, просто добавьте параметр -d при запуске в аргументах командной строки.

Аргументы командной строки

person JohnnBlade    schedule 20.07.2012
comment
@johnblade: я использовал таймер, цикл просто зацикливается на всех процессах, таких как foreach (процесс p в plist) { } . Да, я тоже пытался использовать backgroundworker. и даже поставить thread.sleep(1000), чтобы немного замедлить его. Существуют ли какие-либо инструменты, которые просто каким-то образом указывают на ошибки. Я скачал CLR-профилировщик, но, о боже, похоже, чтобы с ним работать, нужна целая неделя. (нет никаких сохранений данных или таблиц данных) - person arvind; 20.07.2012
comment
Вы можете заставить его работать в Visual Studio с аргументом -d? - person JohnnBlade; 20.07.2012
comment
Я установил параметр -d, и мне нужно запустить его в Visual Studio. Я размещу обработчики событий (думаю, их нужно поместить в program.cs) - person arvind; 20.07.2012
comment
мои события находятся в статической основной функции, добавьте их туда - person JohnnBlade; 20.07.2012
comment
кажется, все в порядке, когда он запускается из визуальной студии, теперь это просто полная путаница. и вылетает при автономном запуске. я думаю, я буду запускать больше тестов. я бы хотел иметь волшебную палочку или джинна - person arvind; 20.07.2012
comment
я пометил это как ответ, потому что это дало мне возможность диагностировать больше. Я бы рекомендовал microsoft.com/en-us/download/details .aspx?id=26798 Приложение, которое кажется полезным. спасибо всем за ответы - person arvind; 21.07.2012

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

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

Добавить в конструктор

AppDomain currDomain = AppDomain.CurrentDomain;
currDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExHandler);

и добавьте также этот обработчик

private void UnhandledExHandler(object sender, UnhandledExceptionEventArgs args)
{
    Exception e = (Exception)args.ExceptionObject;
    // Log the exception here
}
person Simon    schedule 20.07.2012
comment
попробую с включенным отладчиком. - person arvind; 20.07.2012