![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ЛОгирование исключений
@!!ex © (2010-10-06 19:35:00)Нашей некий код, заменяющий стандартную функцию RTLUnwindProc:
procedure MyRtlUnwind; stdcall;
var
PER : PExceptionRecord;
procedure DoIt;
begin
//обработка исключения
end;
begin
asm
mov eax, dword ptr [EBP+8+13*4]
mov PER, eax
end;
DoIt;
asm
mov esp, ebp
pop ebp
jmp oldRTLUnwindProc
end;
end;
Объясните пожалуйста, что делает ассемблерная вставка?
Ну вторую часть я понял - вызов стандартного обработчика... А первая?? До DoIt??
Игорь Шевченко (2010-10-06 21:33:00) [1]
> Объясните пожалуйста, что делает ассемблерная вставка?
http://msdn.microsoft.com/en-us/library/ms680609(VS.85).aspx
http://www.wasm.ru/article.php?article=Win32SEHPietrek3
Rouse_ (2010-10-06 20:36:00) [2]Посмотри Jedy там идет правильный хук обработчика исключений с выводом стека фреймов исключений
@!!ex (2010-10-06 19:47:00) [3]Подбором вычислил - 8+14*4
@!!ex (2010-10-06 19:40:00) [4]в смысле первая тоже понятно, устанавливает указатель на структуру... но откуда взять актуальное число для указателя??
@!!ex (2010-10-06 19:37:00) [5]Вообще этот код на TDE работает...
Но!
в DoIt есть вот такой блок:
if PER^.ExceptionFlags and 1=1 then // This seems to be an indication of internal Delphi exception,
begin // thus we can access 'Exception' class
try
E := Exception( PER^.ExceptObject);
if (E is Exception) then
s:=s+'Delphi exception, type '+E.ClassName+', message: '+E.Message+#13#10;
except
end;
end;
Который должен давать доп. инфу... вот он не работает. Как я понимаю из-за неверного кода в ассемблерной вставке(пример сделан для D7, а я пишу на TDE, видимо RTL слегка изменился).
Гуглить пробовал, вся инфа идет времени D7.