Отслеживание ошибки в двоичном процессе
От: EKup Россия  
Дата: 10.04.07 12:08
Оценка:
Сорри, если неправильно формулирую
Есть такая задача: написать прогу на с#, которая будет запускать программы из списка и перезапускать их в случае возникновения ошибки. Контролируемые программы написаны не мной и не на NET.

Собстно у меня один вопрос: как отследить момент появления АшыПки в процессе? (момент, при котором выводится окно о невозможности дальнейшей работы программы, типа она будет закрыта и тд.)
Re: Отслеживание ошибки в двоичном процессе
От: Аноним  
Дата: 10.04.07 12:25
Оценка:
Здравствуйте, EKup, Вы писали:

EK>Сорри, если неправильно формулирую

EK>Есть такая задача: написать прогу на с#, которая будет запускать программы из списка и перезапускать их в случае возникновения ошибки. Контролируемые программы написаны не мной и не на NET.

EK>Собстно у меня один вопрос: как отследить момент появления АшыПки в процессе? (момент, при котором выводится окно о невозможности дальнейшей работы программы, типа она будет закрыта и тд.)


Как вариант, можно перехватывать SEH-исключения — access violation, stack overflow и т.д.

Сделать это можно так:

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.ThreadException +=
            new ThreadExceptionEventHandler(Application_ThreadException);

        // ... запускаем задачи
    }

    static void Application_ThreadException(Object sender, ThreadExceptionEventArgs e)
    {
        MessageBox.Show(e.Exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
Re: Отслеживание ошибки в двоичном процессе
От: _Morpheus_  
Дата: 10.04.07 12:32
Оценка:
Здравствуйте, EKup, Вы писали:

EK>Сорри, если неправильно формулирую

EK>Есть такая задача: написать прогу на с#, которая будет запускать программы из списка и перезапускать их в случае возникновения ошибки. Контролируемые программы написаны не мной и не на NET.

EK>Собстно у меня один вопрос: как отследить момент появления АшыПки в процессе? (момент, при котором выводится окно о невозможности дальнейшей работы программы, типа она будет закрыта и тд.)


вобщемто никак, если нужно хоть как-то, то можно попробовать отслеживать все окна приложения и анализировать заголовки окон, если в заголовках окон встречается чтонить вроде "Error", "Exception" и т.п. то считать что приложение вывело окно с сообщением об ошибке, но нет гарантии что проложение не откроет окно с текстом вроде "Processed with no errors"
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[2]: Отслеживание ошибки в двоичном процессе
От: _Morpheus_  
Дата: 10.04.07 12:36
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>
А>        Application.ThreadException +=
А>


в постановке задачи говорится что нужно отслеживать ошибки в чужом процессе, причем чужой процесс даже не является дотнетным
Т.е. никакой возможности узнать что в нем происходит нет, соответственно и понять когда в нем происходит ошибка и действительно ли это ошибка невозможно
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re: Отслеживание ошибки в двоичном процессе
От: _Morpheus_  
Дата: 10.04.07 12:39
Оценка:
Здравствуйте, EKup, Вы писали:

EK>Собстно у меня один вопрос: как отследить момент появления АшыПки в процессе? (момент, при котором выводится окно о невозможности дальнейшей работы программы, типа она будет закрыта и тд.)


еще можно периодически проверять состояние процесса — если он умер, то запускать его заново
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[2]: Отслеживание ошибки в двоичном процессе
От: EKup Россия  
Дата: 10.04.07 14:39
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

_M_>Здравствуйте, EKup, Вы писали:


EK>>Собстно у меня один вопрос: как отследить момент появления АшыПки в процессе? (момент, при котором выводится окно о невозможности дальнейшей работы программы, типа она будет закрыта и тд.)


_M_>еще можно периодически проверять состояние процесса — если он умер, то запускать его заново


Проблема в том, что он не умирает, а выводит окно: "приложение выполнило недопустимую операцию", "будет закрыто" и тд. И ждет реакцию пользователя. Собстно мне и надо, чтоб программа перезапускалась сама, без пользователя.

Так что тут 2 варианта: либо с помощью Win API как-то отслеживать ошибку в приложении, либо запускать процесс так, чтобы он при ошибке сам закрывался. А потом проверять, умер ли он.

А как собстно запускать процесс, чтобы он при ошибке сразу закрывался?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.