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...