Aplikacja kilkuwątkowa - crash i regeneracja wątku

0

Witam.

Mam aplikacje kilkuwątkową. Co ok 20 minut w jednym wątku występuje crash.

Jak mogę wykryć, że wątek zcrashowal i go zregenerować tak aby nie pojawił się krytyczny (wysyłanie błędu do microsoftu) ?

Trzeba wyrzucić wyjątek ?

Można mieć 1 wątek i pętle, która sprawdza czy watek nie scrashowal i w razie czego stworzy nowy?
Ale chyba wtedy chyba nie zniknie okienko błędu krytycznego programu.

Pozdrawiam.

0

Bardzo prosto:

int thread()
{
	int value, crashed = 1;
	while (crashed)
	{
		crashed = 0;
		try
		{
			value = function();
		}
		catch
		{
			crashed = 1;
		}
	}
	return value;
}
0

A nawet prościej:

int thread()
{
        for(;;)
        {
                try
                {
                        return function();
                }
                catch { }
        }
}

Tylko nie zapomnij posprzątać po crashu, bo w przeciwnym razie memory leak będzie się zwiększał co crash.

0

Czyli jeżeli wystąpi wyjątek to w catch mam np przypisać do zmiennej true, i w innym wątku głównym sprawdzić czy true, jeżeli tak to przerwać scrashowany wątek za pomocą TerminateThread, tak?
Ale wtedy chyba i tak sie pojawi okno błędu krytycznego (Wysyłaj błąd do microsoftu / nie wysyłaj). Co zrobić żeby takie okno się nie pojawiło?

I jeszcze jeden problem.

W catch trzeba w nawiasie wpisać jakiś typ albo trzy kropki (uniwersalny), tylko trzeba rzucić tam wyjątek.

Tylko, że ja nie wiem kiedy rzucić wyjątek. Bo nie mam pojecią gdzie znajduje się błąd w kilkunastotysięczo linijkowej aplikacji (błąd występuje co ok 7 godzin, więc chce go zamaskować regenerując wątek) . I nie chce zbytnio tam zmieniać dodawać throw itd. Czy jest jakiś uniwersalny throw, który zostanie wyrzucony automatycznie przy crashu ?

Pozdrawiam.
Z góry dziękuje

0

Aha, czyli błąd występuje w twoim kodzie ? To znajdź go po prostu. Włącz debugger na 7h i poczekaj aż wyjątek się pojawi. Zobacz co go spowodowało wyeliminuj błąd. Możesz wszystko sobie podglądnąć, jaki wyjątek i gdzie, jakie wartości mają zmienne, stos wywołań funkcji. Taki try..catch to już ostateczność ostateczności, akt desperacji, bardzo nieeleganckie rozwiązanie problemu.

w catch mam np przypisać do zmiennej true, i w innym wątku głównym sprawdzić czy true
Nie. Wszystko się dzieje w jednym wątku.

jeżeli tak to przerwać scrashowany wątek za pomocą TerminateThread, tak?
Nie. Zacząć pracę od nowa dalej w tym samym wątku. Popatrz na przykład. Widzisz jakieś inne wątki albo TerminateThread ?

Ale wtedy chyba i tak sie pojawi okno błędu krytycznego
Nie pojawi się pÓÓÓÓki crash jest w tym wątku.

W catch trzeba w nawiasie wpisać jakiś typ albo trzy kropki (uniwersalny), tylko trzeba rzucić tam wyjątek.
Z tego co napisałeś wyjątek już jest rzucany. Takie okienko crashu aplikacji jest pokazywane właśnie jak jakiś wyjątek zostanie rzucony i go nie przechwycisz catch'em. O to chodzi abyś teraz go przechwycił, dzięki temu okienku crash'u się nie pojawi i będziesz mógł kontynuować wątek zaczynając pracę od nowa (patrz przykład).

0

Po tylu latach nie wiedziałem zabardzo co to jest debuger : D, dzięki.

Nie wiedziałem, że to pokazuje na której linijce jest błąd.

Tylko, że mam problem.

Exe można bardzo łatwo debugować. Tylko, że mój program to biblioteka dll, która jest wstrzykiwana do OBCEJ aplikacji.

Jak mogę debugować wstrzykniętą bibliotekę dll ?

Pozdrawiam

//złączam
Dodam, że mój kompilator to Visual c++ 2008 Express Edition.

Tam w zakładce debug jest "Attach to process", no i niby wstrzykuje do procesu, ale się zakańcza jakoś i nie uruchamia się moja biblioteka.

//złączam
Dodane:

Odkryłem, że jak się wybierze Attach to process to debuguje proces. I wtedy jak wstrzykne swoim injectorem biblioteke to jest ok.

Tylko, że jeżeli jest błąd to pokazuje tylko na jakim adresie jest wyjątek, nie ma pokazane w której linijce : /, bo po prostu on niewie tego, bo debuguje obcy proces.

Więc jak moge debugować wstrzykniętą bibliotekę, żeby pokazywało mi na której linijce wystąpił wyjątek?

Pozdrawiam.

//złączam
Pomyłka. Pokazuje linijke na której był błąd : D, problem rozwiązany

//Czeszesz post za postem, może by tak się zarejestrować ? Będziesz mógł edytować swoje posty - adf88

1 użytkowników online, w tym zalogowanych: 0, gości: 1