Przechwytywanie bledow

0

Hej!

Mam taki problem. Widzialem w jednym programie taki motyw... kiedy wystepowal jakis blad, wyskakiwalo okienko z opisem tego bledu z opcja wyslania informacji o bledzie np. do autora. To nie bylo "standardowe" okienko windows, ale wlasne zrobione przez autora. Bylo w nim bardzo wiele informacji, ktore ulatwiaja odnalezienie miejsca bledu. Mi tam nic nie mowia komunikaty Acces val... cos tam. No i chcialbym takie cos zrobic w moim programie. Ze kiedy bedzie blad, pokaze sie MOJE okienko, a w nim te informacje. Ale jak to zrobic?

Tzn. teoretycznie umiem wychwycic kiedy pojawi sie blad i pokazac okienko. No i pobrac ten "standardowy" komunikat. Ale jak np. wyswietlic stan stosu itp. A najlepiej informacje, w ktorej procedurze byl program w momencie wystapienia bledu.

A moze sa gotowe komponenty do tego? Bylbym bardzo wiedzieczny.

Pozdrawiam

0

komponent madExcept z madCollection madshi.net

0
Woj napisał(a)

komponent madExcept z madCollection madshi.net

tylko, że free jest do użytku niekomercyjnego. Podobny mechanizm jest w pakieci JEDI - JCL\examples\vcl\debugextension poecam najpierw przeczytać plik Howto.txt z tego katalogu

0

Jedna procedurka która może się przydać

procedure TForm1.MyOnE(Sender: TObject; E:Exception);
begin
ListBox1.items.add(E.Message);   //Dodaj błąd do listbox
//Application.ShowException(E);  //pokaż komunikat
end;

w on create formy:

Application.OnException:=MyOnE;
0
pawel_18 napisał(a)

Jedna procedurka która może się przydać

procedure TForm1.MyOnE(Sender: TObject; E:Exception);
begin
ListBox1.items.add(E.Message);   //Dodaj błąd do listbox
//Application.ShowException(E);  //pokaż komunikat
end;

w on create formy:

Application.OnException:=MyOnE;

tyle, że to wyłapuje wyjątki TYLKO generowane przez metody formularzy

0

Uzyłem JCL'a - całkiem fajny.

Ale teraz zauważyłem coś dziwnego...

Najpierw na nowym programie testowałem ten sposób. Działał. Więc przeniosłem do mojego programu, całkiem sporego. Dodałem też buttona, a w nim umieściłem kod:

var i : integer;
begin
i:=strtoint('test');
showmessage(inttostr(i));
end;

czyli specjalnie by wywołać bład. I... nic. Tzn. w ogóle okienko się nie pojawiło, że bład. Myślę - eeee... coś skopany ten JCL. Usunąłem go - przywróciłem stary kod. I dalej to samo. Nie wywala błedu. Uruchamiam pod Delphi... wykrywa. A jako samodzielny plik EXE nie...

Co jest... myślałem. A dodałem ten sam kod do innej procedury, która jeszcze inne rzeczy robi. I tam zadziałał... wyskoczył bład. Użyłem więc ten sposób z JCL'em... i jest ok. Tzn. prawie.. bo jak jest bład w jakieś procedurce reaguje. Ale nie jestem pewien czy zawsze, bo gdy sam zrobiłem procedurkę i celowo popełniłem w niej bład - nic nie sygnalizuje. Jakby omija błąd.

Tzn. nie omija... bo kolejne linie po linii z błędem nie są wykonywane. Ale nie ma też żadnego komunikatu, nic...

Co może być?

0

A masz włączoną obsługę błędów? Project->madExcept settings
jeżelin nie jest zaznaczone enable MadExcept to zaznacz.

0

kAzek to nie ten komponent.
Karolek1984 po ierwsze masz zaznaczone to:

user image

a po drugie przebuduj (nie ort!) cały projekt. U mnie działa idealnie

0

To jeszcze ostatnie pytanie do tematu...

a jak jest z bezpieczeństwem? Tzn. dodając takie informacje do pliku, nie ułatwiam tym samym "crackerom" dekompilację takiego programu?

To pierwsze. A drugie - zauważyłem, że jak skompiluje program i uruchomie... dziala ok. Wykrywa błędy i podaje dokładne informacje. Ale jak skompresuje program UPX'em... to już póxniej nie ma tych dokładnych informacji. czyli UPX pewnie usuwa coś :(

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