Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программное отслеживание событий в журнале Event V 
:(
    Опции темы
PrAviva
Дата 13.11.2009, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.11.2009

Репутация: нет
Всего: нет



Всем добрый день! У меня есть вопрос к знающим людям.
Предистория: Есть файл, из которого на прибор идет подача команд. Когда прибор виснет или появляется ошибка, то в журнале ошибок Event Viewer появляется соответствующая запись. Мне нужно отследить момент появления этого сообщения и прекратить подачу команд в прибор. Но не просто прекратить, а и зафиксировать то, какая команда передалась последней, чтобы дальше прогонять предыдущие несколько команд, приближаясь к комбинации, вызвавшей вылет программы или ошибку. Таким образом, научившись программно реагировать на факт добавления сообщения о вылете основной программы в журнал событий, можно вовремя остановить ПО тестирование, и отметить в логе этого ПО, примерно после каких воздействий произошёл вылет.
А теперь сам вопрос: Как программно отслеживать факт добавления сообщения о вылете основной программы в журнал событий? Подскажите, пожалуйста! smile  smile  smile 

Это сообщение отредактировал(а) PrAviva - 13.11.2009, 18:02
PM MAIL   Вверх
dumb
Дата 19.11.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



PM MAIL   Вверх
PrAviva
Дата 30.11.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.11.2009

Репутация: нет
Всего: нет



Здравствуйте! Я снова решила вернуться к непонятному мне вопросу. Вот пример, который я нашла относительно работы с журналом событий и фиксации с помощью функции NotifyChangeEventLog() появления сообщения о событии:
Код

#include <windows.h> 
#include <stdio.h> 

void __cdecl wmain(int argc, LPWSTR *argv) 
{ 
  wchar_t *logName = L"Application";// Имя event log. 
  wchar_t *sourceName = L"SampleEventSourceName"; // Event Source name. 

  BOOL bSuccess; 
  HANDLE hEventLog;
  HANDLE hEvent; 
  DWORD dwWaitResult; 
  hEventLog = OpenEventLogW( //открытие журнала событий
                           NULL, //server name
                           sourceName // Event log source name. 
                           ); 
 


 if (hEventLog == NULL) 
  { 
    printf("Could not open event log."); //если не удалось открыть журнал
    return; 
  } 

     hEvent = CreateEvent //Создание объекта события
                       (NULL,  // атрибут защиты
                        FALSE, // тип сброса FALSE – автоматический
                        FALSE, // начальное состояние FALSE – не сигнальное
                        NULL); // без имени обьекта 
  
  NotifyChangeEventLog(hEventLog, hEvent); //получение уведомления о событии

  dwWaitResult = WaitForSingleObject //ожидание события
                            (hEvent, //идентификатор объекта
                             INFINITE); // время ожидания в миллисекундах

  if (dwWaitResult == WAIT_FAILED) 
    printf("Could not wait for an event to occur."); 
    else 
    printf("An event has been logged.\n"); 

    CloseHandle(hEvent); 
    CloseEventLog(hEventLog); 
    return; 
} 


Но это только самое начало. Дело в том, что мне нужно фиксировать не просто наличие добавления новой записи в журнад событий, а и отмечать в др. месте (некотором log-файле) список последних, например, 10-ти отосланных кодов нажатия пульта. Это поможет выявить комбинацию, привеждую к вылету прибора. Но тут море вопросов. 
Например, получили мы сообщение "An event has been logged". И что с этим делать? Ведь мне нужно понять не только то, что был сбой, но и какие отсылаемые коды команд к этому сбою привели. Если я беру пересылаемые коды из какого-то файла, то может нужно писать какой-то счетчик, который будет фиксировать порядковый номер кодов?В том смысле, чтобы по вылету можно было в огромном массиве данных файла и кодами выделить именно ту команду, после которой произошел вылет. И как это организовать? Есть ли идеи? Заранее спасибо за помощь!  smile  smile  smile 

Это сообщение отредактировал(а) PrAviva - 30.11.2009, 15:32
PM MAIL   Вверх
GremlinProg
Дата 30.11.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(PrAviva @  30.11.2009,  17:27 Найти цитируемый пост)
И что с этим делать? Ведь мне нужно понять не только то, что был сбой, но и какие отсылаемые коды команд к этому сбою привели

ну и в чем же проблема?
http://msdn.microsoft.com/en-us/library/aa363654(VS.85).aspx
не такой большой список функций, чтобы запутаться

Добавлено через 3 минуты и 1 секунду
 + примеры: http://msdn.microsoft.com/en-us/library/bb427356(VS.85).aspx


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
PrAviva
Дата 30.11.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.11.2009

Репутация: нет
Всего: нет



GremlinProg, спасибо, мне с функциями вцелом ясно. Вопрос в том, как следить за потоком кодов коман? Зависание я при помощи журнала сообщений отловлю, а вот последовательность переданных кодов? Мне нужно после того, как функция NotifyChangeEventLog() укажет на наличие новой записи в журнале событий бежать в др. файл, куда ранее записывалить коды переданных команд и анализировать, например, последние 10-ть. Вопрос в том как это осуществить?Ведь прибор-то висит. Или после перезагрузки данные в этом файле останутся даже без сохранения?  smile  smile  smile 
PM MAIL   Вверх
GremlinProg
Дата 30.11.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(PrAviva @  30.11.2009,  18:02 Найти цитируемый пост)
Или после перезагрузки данные в этом файле останутся даже без сохранения?

это зависит от прибора, посмотри его документацию,
либо - воочию убедиться в том, что он делает при сбое,

можно предположить, что если файл используется как очередь(FIFO), и чтение и исполнение команд устройством небуферизировано,
то к сбою привела команда, записанная в этот файл непосредственно перед той командой,
которая расположена в самом начале, т.е. перед первой

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

вобщем, без документации на прибор можно только гадать

Добавлено через 3 минуты и 47 секунд
Цитата(GremlinProg @  30.11.2009,  18:23 Найти цитируемый пост)
это зависит от прибора

скорее даже от драйвера, поставляющемуся с этим прибором


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
PrAviva
Дата 30.11.2009, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.11.2009

Репутация: нет
Всего: нет



GremlinProg, а если это будет log-файл? Ведь этот тип файлов автоматически сохраняется после вылета прибора. 

Кстати, при сбое прибор последние данные и все-все, что не было "принудительно" сохранено в архиве, не сохраняет. Так что файл, где будет регистрироваться постоянно пополняемая последовательность кодов должен автоматически сохраняться послы вылетов. 

А вообще я читала, что изначально журналов событий три, но можно создавать свои журналы, и регистрировать свои приложения как источники событий для этих журналов (в моем случае - я думаю, может записывать туда последовательность кодов? Ведь журнал событий уж точно после вылета сохранится). 

Может есть путь попроще? есть какая нибудь команда вроде "по вылету закрыть все приложения с автоматическим сохранением"?  smile  Это бы очень упростило задачу, которая сейчас еще на стадии обдумывания.

Это сообщение отредактировал(а) PrAviva - 30.11.2009, 17:44
PM MAIL   Вверх
GremlinProg
Дата 30.11.2009, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



PrAviva, человеческим языком объясни: что за прибор, как он работает, что за архив, и при чем тут лог файлы?

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

если я вообще правильно въехал в проблему:

1. имеется какое-то устройство
2. это устройство воспринимает последовательность команд
3. для этого устройства есть драйвер (служба)
4. драйвер мониторит определенный файл команд (на диске) и отправляет их (команды) устройству

5. есть приложение, которое пишет в этот файл команды
6. и следит за тем, чтобы устройство их выполнила
7. если происходит зависание устройства, происходит запись в журнал событий
8. программа, при этом, должна прекратить запись в файл
9. и определить, какая команда была выполнена последней (та, что привела к ошибке)


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
PrAviva
Дата 30.11.2009, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.11.2009

Репутация: нет
Всего: нет



ПО прибора написано не мною, моя же задача - выявление причин вылетов, определение последовательностей действий, приводящих к вылетам, зависаниям и ошибкам. 
Прибор воспринимает последовательность команд от пульта. Я же беру файл с набором кодов этих самых команд, передаю прибору и должна анализировать вылеты и разбираться с теми командами, которые их вызвали (например, с последними 10-ю переданными).  Пункты 7, 8 и 9 - моя глобально задача. Нужно следить за журналом событий, передавая коды команд из файла в файл, после вылета нужно четко знать "что последнее пришло", а дальше уже вручную разбираться с кодами команд и выявлять ошибочную комбинацию.



Это сообщение отредактировал(а) PrAviva - 1.12.2009, 10:59
PM MAIL   Вверх
GremlinProg
Дата 30.11.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(PrAviva @  30.11.2009,  20:44 Найти цитируемый пост)
Сканер воспринимает последовательность команд от пульта. Я же беру файл с набором кодов этих самых команд, передаю прибору и должна анализировать вылеты

раз передаешь команды прибору сама, значит порядок этих команд можно спокойно контролировать,
типа такого:
Код

for( int i = 0 ; i < CommandsCount ; ++i ){
  SendToScaner( Command[i] );
  if( ::WaitForSingleObject( hEvent, MS ) == WAIT_OBJECT_0 ){
    //  ошибка на i-й команде!!!
  }
}

MS - подобрать вручную - это минимальное число мс., за которое сканер точно обработает 1 команду
будет работать медленно, но, по крайней мере, ошибку точно найдешь, если откалибруешь MS

если нет постоянного доступа к сканеру, чтобы подобрать параметры, MS можно вынести в GUI и отлаживать на месте


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.