Posted By: dzemen () on 'CZprogram'
Title:     Re: Access handling
Date:      Thu Nov 13 13:59:12 2003

> > > ako zachytit access violation a podobne errory vo svojom procese ? A
> > zaroven
> > > lognut veci ako call stack, registre, prip. rozne debug info a podobne
> > (ako
> > > to 
> > 
> > Pokud se bavis o MSVC++, tak tam musis mit program prelozeny tusim s /EHa 
> > (asynchronous exception handling). Potom zachytis access violation v catch
> 
> > (...). Typ vyjimky a registry asi pujdou zjistit nejakou API funkci (nikdy
> 
> > sem to neresil). No a kdyz uz mas registry, tak callstack je trivka :) 
> 
> Ale ja nechcem vsetok kod davat do try - catch.. Navyse mam nejake
> third-party 
> DLLs, ktore mozu tiez vyvolat access a ja ho chcem zachytit.
> 
> Nieco sa da zachytit pomocou signal(...), ale kym sa to tam dostane, prejde 
> to roznymi inymi zachytavacimi levelmi, takze registre aj stack uz su davno 
> zabudnute.. Existuju rozne kniznice, ktore sa len staticky prilinkuju a
> vsetko 
> spravia bez zasahu do samotneho source kodu.. Prave take riesenie ma
> zaujima.. 

Pokud chces chytat exception na nejvyssi urovni, pouzij fci 
SetUnhandledExceptionFilter s parametrem fce typu 
LPTOP_LEVEL_EXCEPTION_FILTER (koukam do WinAPI dokumentace k Delphi). Tahle 
funkce ma parametr typu STRUCT _EXCEPTION_POINTERS, ktery se sklada z 
PEXCEPTION_RECORD (obsahuje kod vyjimky, priznaky (ma smysl asi jen u 
Access Violation, kde rika, zda nastala tato vyjimka pri zapisu, nebo 
pri cteni), adresu,....proste vsechno o te vyjimce) a z PCONTEXT, ktery 
obsahuje registry procesoru v momente vyjimky. 
Pomoci ESP/EBP registru a toho, co je ulozeno ve stacku se da udelat i 
kompletni backtrace. :-) Alespon u Delphi to jde (myslim si, ze to ale pujde 
kdekoliv, zalezi jen na tom, jak si program uchovava ESP.
No a v pripade, ze mas prilinkovane informace o cislech radek a nazvech 
procedur/unit (u Borlandu je to tusim volba Include TD32 info), tak se do toho 
backtrace daji vypsat i nazvu unit, procedur a cisel radek. 

Jo a abych nezapomnel: Pouziti je takove, ze na zacatku programu das 
SetUnhandledExceptionFilter(mojefce) a od te doby do ni (do mojefce) padaji 
vsechny neodchycene vyjimky. 

Dzemen

P.S.: Doporucuji prohledat starsi posty, uz se to tu resilo...

Search the boards