Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват падения чужой программы 
:(
    Опции темы
Comm
Дата 11.2.2010, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем большой привет)

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

Подскажите в какую сторону рыть...быть может запустить сервер из под какой нибудь апи функции и дальше по плану...или всё гораздо сложнее ?

Спасибо за любую помощь.






--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
SenkraD
Дата 11.2.2010, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

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



1.) Если есть код сервака, то SetUnhandledExceptionFilter в помощь
2.) Да можно запустить через CreateProcess и потом ждать его через
     WaitForSingleObject. Если он умрёт "нелегальным" путём (функа
     вернёт не WAIT_OBJECT_0), то перезапускай и жди по новой
3.) Можно попытатся хук вцепить с DLL инжектом (но как не скажу - в старых
     исходниках нуно смотреть



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Comm
Дата 11.2.2010, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Если он умрёт "нелегальным" путём

Всё понятно,спасибо...только уточнить нужно, нелегальным путем это значит слетит намертво,а легальным - его просто закроют .. я правильно понял ? 


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
SenkraD
Дата 11.2.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

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



Цитата(Comm @  11.2.2010,  18:26 Найти цитируемый пост)
а легальным - его просто закроют .. я правильно понял
ага, только, если мне память не изменяет,
нуно помнить, что вызов TerminateProcess является нелегальным тушением



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Comm
Дата 12.2.2010, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо запомощь,тему н закрываю т.к. возможны ещё вопросы  smile 


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
Comm
Дата 14.2.2010, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Использование ф-и WaitForSingleObject не дало нужных результатов, так-как она срабатывает только после полной остановки подопечного приложения ((

Другими словами если происходит  ошибка и рядом никого нет ктобы мог нажать на "ОК" окна выскачившей ошибки то WaitForSingleObject так и провесит ожидая ... вот

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

Так же пробовал после CreateProcess без ф-и ожидания  WaitForSingleObject  проверять периодически функцией GetExitCodeProcess код возврата... всё бы хорошо если GetExitCodeProcess >0 то ошибка,но и STILL_ACTIVE(означает что процес ещё работает) тоже больше нуля... и как тут определить что по чем фиг знает..


Какие будут предложения ? Спасибо всем )

Это сообщение отредактировал(а) Comm - 14.2.2010, 17:26


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
bra1ny
Дата 15.2.2010, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



После ошибки поток не завершается , а висит в подвешенном состоянии это вы правильно заметили.

Самый просто вариант , искать это окно с ошибками через FindWindow и прибивать процесс а потом запускать заново.
 
Или можно попробовать в реестре в ключе  HKLM\Software\Microsoft\Windows NT\AeDebug  свой сервер там прописать , потом также искать это окно с ошибкой и нажимать кнопку отмена и все. 
--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
Comm
Дата 15.2.2010, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Самый просто вариант , искать это окно с ошибками через FindWindow и прибивать процесс а потом запускать заново.

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

Но ошибки бывают в виде "Отправить отчет об ошибке" вопрос в том совпадет ли хендл окна этой ошибки с серврным ...

Спасибо за внимание)


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
SenkraD
Дата 15.2.2010, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

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



Comm, тогда уже лучше периодически делать snapshot
процессов и искать там ваш сервак, и перезапускать его если его там нет.

P.S. А вообще, щас подумаю, что можно ещё сделать



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
bra1ny
Дата 15.2.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



так отключите windows error reporting и не будет этого окна с отправкой отчета. мой компутер -> правая кнопка мыши -> свойства ->дополнительно ->Отчет об ошибках. 
И тупо ишите по заголовку окна , как я вам посоветовал. 

Цитата

Comm, тогда уже лучше периодически делать snapshot
процессов и искать там ваш сервак, и перезапускать его если его там нет.

С чего его там не будет? Процесс будет висеть пока не выберут один из пунктов .
--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
Comm
Дата 15.2.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот Вам обоим пока по + а я пойду все это длао попробую, и отпишусь ))) а если что ещё придумаете ,пишите не стесняйтесь =)


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
SenkraD
Дата 15.2.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

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



Comm, bra1ny, что скажете на CreateRemoteThread(или инжект),
который ставит фильтр исключений посредством SetUnhandledExceptionFilter с нужной
тебе логикой?


Это сообщение отредактировал(а) SenkraD - 15.2.2010, 15:55


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Comm
Дата 15.2.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Comm, bra1ny, что скажете на CreateRemoteThread(или инжект),
который ставит фильтр исключений посредством SetUnhandledExceptionFilter с нужной
тебе логикой?


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

Я вот тут думаю можно ли при появлении ошибки,зная хендл окна этой ошибки...определить какая стандартная иконка в нем установлена, т.е. ошибка там уведомление и тд итп  ???


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
RatHat
Дата 16.2.2010, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



если сервак твой, и есть возможность его модифицировать, то вариантов есть много.
Например (достаточно тупой вариант): влепить там отдельным потоком серверный сокет, на который внешняя программка-guard будет периодически стучаться и спрашивать состояние. Ну и, если получает корректный ответ, то всё нормально. Ну а если ненормально, то уже перезапускать. 

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

А по умному тебе уже Senkrad  и bra1ny предложили ^^


Это сообщение отредактировал(а) RatHat - 16.2.2010, 13:49
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
azesmcar
Дата 16.2.2010, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



удалено

Это сообщение отредактировал(а) azesmcar - 16.2.2010, 15:23
PM   Вверх
SenkraD
Дата 16.2.2010, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

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



удаленно

Это сообщение отредактировал(а) SenkraD - 16.2.2010, 15:25


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Comm
Дата 23.2.2010, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Comm, bra1ny, что скажете на CreateRemoteThread(или инжект),
который ставит фильтр исключений посредством SetUnhandledExceptionFilter с нужной
тебе логикой?

Решил воспользоваться твоим советом, но возникли некоторые трудности

Судя по описанию CreateRemoteThread внедряет поток в адресное пространство процесса
далее SetUnhandledExceptionFilter устанавливает(или перезаписывает финальный обработчик исключений,если он есть) Вопрос в том  если допустим в коде сервера установлен ещё внутрипоточный обработчик исключений,то после его обработки попадет ли он в мою финальную функцию обработки  Ексепшена ?

Или я не правильно понял принцип работы этого метода ? Спасибо за помощь.


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
SenkraD
Дата 24.2.2010, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

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



Comm,  этот медот SetUnhandledExceptionFilter работает по принципу
"кто последний - тот и папа", так что ты ставишь свой обработчик, а функа тебе возвращает
указатель на обработчик, который был до тебя. А дальше можеш обрабатывать сам,
можеш сначала вызвать старый потом себя или наоборот.

Тебя этот нюанс интересовал?

P.S. Ещё вродь есть фун-ка типа AddVectorHandler или как-то так, она добавляет твой
обработчик в конец очереди, но не факт что к нему дойдёт вызов - кто-то может вызвать
TerminateProcess или что-то подобное, или кто-то пометит исключение как обработаное



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
XPyCT
Дата 24.2.2010, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Comm, 
Уважаемый а какой сервер если не секрет не РФ онлайн часом?
PM MAIL Skype   Вверх
Comm
Дата 24.2.2010, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Comm, 
Уважаемый а какой сервер если не секрет не РФ онлайн часом? 

Нет, Counter-Strike\Source
Цитата

Тебя этот нюанс интересовал?

Да, и ещё не понятно как функа CreateRemoteThread работает


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
SenkraD
Дата 24.2.2010, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

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



вот те раз и вот те два + можеш в Рихтере посмотреть.
(Если нет или лень искать постучись в асю - выдам chm-файл)


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Platov
Дата 24.2.2010, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Может я и не в тему, но почему нельзя написать клиента который приконнектится к серверу и будет ждать когда тот упадёт?
PM MAIL   Вверх
Comm
Дата 24.2.2010, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

вот те раз и вот те два + можеш в Рихтере посмотреть.
(Если нет или лень искать постучись в асю - выдам chm-файл) 

Информация  в ссылках хорошая,всё понятно...а что за инфа  в chm файле ?


Цитата

Может я и не в тему, но почему нельзя написать клиента который приконнектится к серверу и будет ждать когда тот упадёт? 

Потому что после ошибки сервер ещё может частично функционироваь + это не серьезно для программы на АСМ ,эту прогу я решил написать имено на этом языке=)) Почему вопросы задаю здесь ? Потому что отвечают с завидной периодичностью.. 

Это сообщение отредактировал(а) Comm - 24.2.2010, 15:21


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
XPyCT
Дата 24.2.2010, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Comm @ 24.2.2010,  14:49)
Цитата

Comm, 
Уважаемый а какой сервер если не секрет не РФ онлайн часом? 

Нет, Counter-Strike\Source



ну дабы не изобретать велосипед в сервере рфонлайн есть батник который следит за падением екзешника(а это гс сервер)
и поднимает его! если интересует могу порытся поискать для вас
пс: Раньше держал рф онлайн и часто читерки ложили сервер батник поднимал без проблем
PM MAIL Skype   Вверх
Comm
Дата 24.2.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

если интересует могу порытся поискать для вас

Было бы хорошо !


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
XPyCT
Дата 24.2.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Автоподъем для любого сервера:

-> Создаём txt файл
-> пишем туда код
-> меняем название зоны(вашего сервера) на своё
-> закрываем сохраняем с расширением BAT
-> После кладем в папку где находится зона(ваш сервер)
-> Запуск

пс: под именем зона понимается World Server сервер  World Server.exe

Код

@echo Off
Title World Server Monitor
:bof
echo Starting the World Server...
START "World Server" /Wait /Min Название зоны
echo World Server Crashed!
echo Performing Reload
:eof
echo End of Script...
goto :bof


надеюсь вам поможет
PM MAIL Skype   Вверх
Акакий
Дата 28.7.2010, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мда... Название темы такое многообещающее... А по существу, т.е. как перехватывать Exception в чужой проге, не сказано ровно ничего.

Код

type
  TDebugThread = Class(TThread)
  Private
  Protected
    Procedure Execute; override;
  Public
    Constructor Create;
    Destructor Destroy; override;
  End;

..............

procedure TForm1.FormCreate(Sender: TObject);
begin
  DebugThread := TDebugThread.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DebugThread.Terminate;
end;

Constructor TDebugThread.Create; 
Begin 
   Inherited Create(False); 
   FreeOnTerminate := True; 
End; 

Destructor TDebugThread.Destroy; 
Begin 
   Inherited Destroy; 
End; 

Procedure TDebugThread.Execute;
Var 
  DebugEvent : _Debug_Event; 
  OpenHandle : THandle;


Begin
   OpenHandle := OpenProcess(PROCESS_ALL_ACCESS, True, сюда кладем ProcessId);

   While (not Terminated) do
   Begin 
      Sleep(10);
      IF (WaitForDebugEvent(DebugEvent, 100)) Then
      Begin
         If DebugEvent.dwDebugEventCode=EXCEPTION_DEBUG_EVENT then
           begin
             ShowMessage('Exception блин');
             ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, DBG_EXCEPTION_NOT_HANDLED);
           end
         Else
         ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, DBG_CONTINUE);
      End
       Else Sleep(50);
   End;

   CloseHandle(OpenHandle);
End;

end.





Это сообщение отредактировал(а) Акакий - 28.7.2010, 16:33
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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