.net приложение аварийно завершает работу без исключения - PullRequest
7 голосов
/ 15 декабря 2010

У меня происходит сбой приложения .NET 2.0, которое не выдает исключений или каких-либо других сообщений при сбое приложения. Я ловлю событие Application.ThreadException, и при сбое ничего не получается. После нескольких дней работы приложение исчезло! Нет сообщений в журнале событий Windows, нет файла дампа или чего-то еще ... Я пытался запустить приложение на нескольких компьютерах, но через несколько дней проблема появляется.

Приложение обменивается данными с другим компьютером через соединение TCP / IP, и все данные действительны все время, нет разорванных соединений или чего-либо еще. Достаточно памяти, также на момент сбоя и т. Д. На диске тоже проблем нет. Нет возможности обновить до .NET 4.0.

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

Если у вас есть опыт или у вас есть полезные советы или инструменты, дайте мне знать!

Ответы [ 4 ]

3 голосов
/ 16 декабря 2010

Если вы используете TCP / IP, то, скорее всего, вы используете потоки.Если поток умирает с необработанным исключением, что очень часто происходит при вызове EndXxxx (), тогда ваше приложение завершается.Это может быть тихим, если отчеты об ошибках Windows отключены на компьютере, нередко на серверах.По крайней мере, перехватите ObjectDisposedException, чтобы вы могли иметь дело с соединением, которое внезапно отключается или принудительно закрывается.

И да, напишите обработчик события для AppDomain.CurrentDomain.UnhandledException, подпишите его в методе Main ().Зарегистрируйте или отобразите значение e.ExceptionObject.ToString (), чтобы вы могли точно сказать, от чего он умирает.

2 голосов
/ 16 декабря 2010

У меня была эта проблема.

Я написал приложение .Net, которое выполняло эмуляцию нажатия клавиш в других приложениях. Я оставляю его включенным всю ночь, надеясь, что к утру он выполнит всю мою работу. Это только что ушло. Он записывал журнал каждый раз, когда входил и выходил из рутины, чтобы я мог точно видеть, что он сделал. Ничего, без исключений. Просто работа работа работа работа работа. А потом, Ничего.

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

<dirtyhack> Я решил это, написав другое .Net приложение (приложение 2), которое запустило аварийное приложение (приложение 1). После столь долгого времени приложение 1 завершает свою работу, а приложение оболочки 2 - непосредственно перед этим. Приложение 2 затем запустит приложение 1 обратно. </dirtyhack>

и так далее, и так далее, пока вся работа не будет выполнена! Грязный и разочаровывающий, но в итоге работал довольно красиво :) Я уверен, что есть гораздо лучший способ сделать это. Я, вероятно, не маршалировал свои вызовы COM API должным образом или что-то еще

Но, похоже, что завершение работы приложения и его перезапуск освобождают память (вместе с утечками) и позволяют запустить ее заново.

Возможно, бесполезно в твоих обстоятельствах, но это моя история. Аминь.

2 голосов
/ 15 декабря 2010

Попробуйте AppDomain.UnhandledException . Application.ThreadException возникает только при возникновении исключения в потоках пользовательского интерфейса.

2 голосов
/ 15 декабря 2010

Когда приложение .Net неожиданно завершает работу без каких-либо сообщений об ошибках или запуска обработчиков необработанных исключений, очень вероятно, что ваше приложение сталкивается с переполнением стека. Это быстро завершит процесс во многих случаях без запуска каких-либо обработчиков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...