Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Вниз

Как подменить обработчик исключений?   Найти похожие ветки 

 
Lin7   (2004-07-27 10:57) [0]

Есть функция SetUnhandledExceptionFilter, с помощью которой можно подменить обработчик исключений.

Делаю:

type
P_EXCEPTION_POINTERS = ^EXCEPTION_POINTERS;

function MainFilter(P: P_EXCEPTION_POINTERS): integer; stdcall;
begin
Result := 0; // показывать системный диалог
// обработка возникших исключений
case P.ExceptionRecord.ExceptionCode of
   EXCEPTION_ACCESS_VIOLATION:
     begin
     end;
   EXCEPTION_DATATYPE_MISALIGNMENT:
     begin
     end;
   else
     begin
      MessageBox(0, "MainFilter","Error", MB_OK );
      Result := 1; // не показывать системный диалог
     end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 SetUnhandledExceptionFilter(@MainFilter);
end;

Пример взят из Инета... и не работает  :(
Кто-нибудь может мне растолковать, как правильно подменить обработчик исключений всего приложения?
У самого разобраться не получается.
Примерчик бы...

Спасибо.


 
VMcL ©   (2004-07-27 11:04) [1]

>>Lin7  (27.07.04 10:57)

Чем не устраивает try/except?


 
Digitman ©   (2004-07-27 11:22) [2]


> обработчик исключений всего приложения


исключения перехватываются/обрабатываются не на уровне приложения, а на уровнях каждого из кодовых потоков процесса приложения


 
Subdigger ©   (2004-07-27 11:24) [3]

public
   { Public declarations }
   procedure ExceptionHandler(Sender: TObject; E: Exception);
 end;

 Application.OnException := ExceptionHandler;


 
Игорь Шевченко ©   (2004-07-27 11:31) [4]

Digitman ©   (27.07.04 11:22)


> исключения перехватываются/обрабатываются не на уровне приложения,
> а на уровнях каждого из кодовых потоков процесса приложения


Таки сложный вопрос - при необработанном исключении в одном из потоков убивается весь процесс :)


 
Lin7   (2004-07-27 11:38) [5]

>>VMcL ©   (27.07.04 11:04) [1]
Этот вопрос напрямую связан с моей проблемой, описанной в топике:
http://delphimaster.net/view/1-1090508016/

Ситуация:
Сделал програмку (несколько форм + пара dll + глобальный хук на грызуна). На моём компе ошибки не выскакивают и прога прекрасно работает. На других вылазят редко, но метко - прога иногда даже падает. Выловить ошибки не могу, т.к. у меня они не появляются. Утечки ресурсов MemProof не находит.

Решение:
Сделать debug"овую версию, в которой будет вестись лог-файл работы проги и попробовать выловить баг так.

Вопросы:
1. Можно ли организовать try - except таким образом, чтобы ВСЕ возникающие исключения сначала обрабатывались этим блоком? - т.е. на except навесить запись в лог-файл.
2. Если кто-то сталкивался (ну наверняка сталкивались!!!) с такой проблемой - поделитесь опытом, как лучше поступить.
Есть ли какие-то особенности в организации/ведении такого лог-файла?

Может быть удастся решить мою проблему с помощью SetUnhandledExceptionFilter.
Только вопрос уже относится к WinAPI - поэтому и был задан в этой ветке.


 
Lin7   (2004-07-27 11:43) [6]


> Subdigger ©   (27.07.04 11:24) [3]
> public
>    { Public declarations }
>    procedure ExceptionHandler(Sender: TObject; E: Exception);
>  end;
>
>  Application.OnException := ExceptionHandler;


Часть кода моей проги расположена в секциях initialization отдельных модулей, поэтому это не сработает... (не перехватит).


 
Digitman ©   (2004-07-27 11:48) [7]


> Игорь Шевченко ©   (27.07.04 11:31) [4]


кто ж спорит ?

но в дан.случае я на другом авторское внимание заостряю - установка обработчика исключения индивидуальна для каждого трэда в отдельности


 
Lin7   (2004-07-27 11:55) [8]


> Digitman ©   (27.07.04 11:48) [7]
>
> кто ж спорит ?
>
> но в дан.случае я на другом авторское внимание заостряю
> - установка обработчика исключения индивидуальна для каждого
> трэда в отдельности

Я правильно понял: SetUnhandledExceptionFilter - ставится на отдельные потоки??!
Вы не ошиблись?


 
Lin7   (2004-07-27 11:57) [9]


> Digitman ©   (27.07.04 11:48) [7]

MSDN:
The SetUnhandledExceptionFilter function enables an application to supersede the top-level exception handler of each thread and process.


 
Lin7   (2004-07-27 12:45) [10]

Ага. Что-то получается...
Сделал модуль:

unit SEHDebug;

interface
uses Windows;
type
 P_EXCEPTION_POINTERS = ^EXCEPTION_POINTERS;

function MainFilter(P: P_EXCEPTION_POINTERS): integer; stdcall;

implementation

function MainFilter(P: P_EXCEPTION_POINTERS): integer; stdcall;
begin
 Result := 1;          // Не показывать системный диалог
//Result := 0;          // Показывать системный диалог
end;

procedure aa;
var
 p:^integer;
begin
 P := Pointer(3);
 P^ := 321;
 MessageBox(0,"111","2222",0);
end;

initialization
SetUnhandledExceptionFilter(@MainFilter);
aa;

end.

Похоже в таком варианте обработчик подменяется (системная мессага не вылетает), но:
1. Всё равно выскакивает "Run-time error 216..." (Delph"овая мессага)
2. Не удаётся продолжить выполнение программы.


 
Игорь Шевченко ©   (2004-07-27 12:49) [11]


> 1. Всё равно выскакивает "Run-time error 216..." (Delph"овая
> мессага)


к SEH не имеющая никакого отношения...


 
Lin7   (2004-07-27 13:06) [12]


> Игорь Шевченко ©   (27.07.04 12:49) [11]
>
> > 1. Всё равно выскакивает "Run-time error 216..." (Delph"овая
>
> > мессага)
>
>
> к SEH не имеющая никакого отношения...


Что можно/нужно сделать, что она не вылетала?


 
Игорь Шевченко ©   (2004-07-27 13:13) [13]


> Что можно/нужно сделать, что она не вылетала?


Найти причину ее возникновения и устранить.


 
Lin7   (2004-07-27 13:37) [14]


> Игорь Шевченко ©   (27.07.04 13:13) [13]
>
> > Что можно/нужно сделать, что она не вылетала?
>
>
> Найти причину ее возникновения и устранить.


:)))
Некорректно выразился.
Имелось ввиду: как предотвратить вывод этой мессаги.
Хотя впрочем это не очень-то и надо...
Скажем так: желательно, но не обязательно.


 
Игорь Шевченко ©   (2004-07-27 13:42) [15]

Lin7   (27.07.04 13:37) [14]


> Имелось ввиду: как предотвратить вывод этой мессаги.


Очевидно, переписать Run-time Library.

Я не совсем понимаю, что за задача стоит - чтобы глючные программы не сообщали о сових глюках или что ?


 
Lin7   (2004-07-27 13:54) [16]


> Я не совсем понимаю, что за задача стоит - чтобы глючные
> программы не сообщали о сових глюках или что ?

Вовсе нет. - Это некорректно по отношению к пользователю. Наоборот я хочу сам обрабатывать баги в своей проге, выдавать пользователю своё окно с информацией об ошибке и с чеком "Отправить информацию об ошибке разработчику" - отсылать bug-report на мой e-mail.

Не хотелось бы переводить топик в флуд.
Всем спасибо.
Думаю топик можно закрыть.
По крайней мере пока...  :)


 
Игорь Шевченко ©   (2004-07-27 14:44) [17]


> Наоборот я хочу сам обрабатывать баги в своей проге, выдавать
> пользователю своё окно с информацией об ошибке и с чеком
> "Отправить информацию об ошибке разработчику" - отсылать
> bug-report на мой e-mail.


try
.....Код твоей программы
except
 Выдача красивого сообщения
end;

Для более продвинутых -
Есть такой ключик в реестре - Image File Execution Options (HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options) - в нем, в параметре Debugger указывается программа, получающая управление при всех ошибках в заданном приложении.


 
Lin7   (2004-07-27 16:05) [18]


> Игорь Шевченко ©   (27.07.04 14:44) [17]
>
> try
> .....Код твоей программы
> except
>  Выдача красивого сообщения
> end;

Дык не получается ведь!
Смотри здесь же выше мой пост       Lin7   (27.07.04 11:38) [5]


> Для более продвинутых -
> Есть такой ключик в реестре - Image File Execution Options
> (HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image
> File Execution Options) - в нем, в параметре Debugger указывается
> программа, получающая управление при всех ошибках в заданном
> приложении.

Моя программа не ориентирована на продвинутых юзеров, которые в состоянии её отладить.  :)

В дополнение: я поспешил с выводами - мой код
unit SEHDebug;...
почему-то подменяет обработчик только для секций initialization/finalization отдельных модулей, а исключения возникающие в модуле формы (VCL) приходится ловить с помощью TApplicationEvents.OnException.
Эта ситуация мне не понятна - при создании формы делфя ставит свой обработчик что-ли?
Это происходит даже если на форме нет TApplicationEvents.
В программе есть пара нитей - вот что с ними делать пока не знаю.


 
Игорь Шевченко ©   (2004-07-27 16:07) [19]


> Дык не получается ведь!


? Может, в консерватории чего-то поправить ?


 
Lin7   (2004-07-27 16:33) [20]


> ? Может, в консерватории чего-то поправить ?

??!
В смысле - намёк, что надо поучиться программы писать?
Опыт - дело наживное. Если бы я сам мог справится с проблемой я не создавал бы топика. Собственно, любой создавший здесь топик, хочет чтобы БОЛЕЕ опытные люди дали ДЕЛЬНЫЙ совет по теме.
Со своей стороны я постарался поконкретнее задать вопрос и дополнение [5].


 
Игорь Шевченко ©   (2004-07-27 16:39) [21]

Lin7   (27.07.04 16:33)


> В смысле - намёк, что надо поучиться программы писать?

Можно и так расценивать.


> Собственно, любой создавший здесь топик, хочет чтобы БОЛЕЕ
> опытные люди дали ДЕЛЬНЫЙ совет по теме.


По какой теме давать дельный совет? По такой:


> Ситуация:
> Сделал програмку (несколько форм + пара dll + глобальный
> хук на грызуна). На моём компе ошибки не выскакивают и прога
> прекрасно работает. На других вылазят редко, но метко -
> прога иногда даже падает. Выловить ошибки не могу, т.к.
> у меня они не появляются. Утечки ресурсов MemProof не находит.


?

Но я надеюсь, ты понимаешь, что не видя программы, не видя кода, не зная условий ее запуска (кроме того, что "на других"), не зная, как падает программа, трудно давать какой-либо дельный совет, кроме [19].

Кроме того, ошибка может быть и не в программе, а в одной из DLL


 
Lin7   (2004-07-27 17:08) [22]


> По какой теме давать дельный совет?

1. Как правильно использовать функцию SetUnhandledExceptionFilter?
2. Как можно (если это в принципе возможно) перехватить и обработать в одной процедуре все исключения (как обработанные так и не обработанные блоками try/except и try/finaly) возникающие в процессе?
3. Какой методикой нужно воспользоваться, чтобы выловить баг в программе, если баг возникает на чужом компьютере и разработчик не имеет возможности отладить программу на этом компьютере?


> Но я надеюсь, ты понимаешь, что не видя программы, не видя
> кода, не зная условий ее запуска (кроме того, что "на других"),
> не зная, как падает программа, трудно давать какой-либо
> дельный совет, кроме [19].

Понимаю. И так же понимаю, что врятли кто-то захочет анализировать несколько тысяч строк кода в поисках нестабильно появляющейся ошибки.  :)
И на дальнейшее хотелось бы иметь возможность писать программы, формирующие отчёт о своих ошибках - над этим и работаю.


> Кроме того, ошибка может быть и не в программе, а в одной
> из DLL

Теоретически - конечно. Но в конкретном случае я этот вариант по ряду причин отбрасываю, считая, что dll написана корректно.


 
Игорь Шевченко ©   (2004-07-27 17:29) [23]

Lin7   (27.07.04 17:08) [22]


> 1. Как правильно использовать функцию SetUnhandledExceptionFilter?


Я полагаю, что в данном случае - никак.


> 2. Как можно (если это в принципе возможно) перехватить
> и обработать в одной процедуре все исключения (как обработанные
> так и не обработанные блоками try/except и try/finaly) возникающие
> в процессе?


Скорее всего, невозможно, так как исключения, возникающие в блоках initialization/finalization программы отловить в самой программе (скорее всего) не получится.


> 3. Какой методикой нужно воспользоваться, чтобы выловить
> баг в программе, если баг возникает на чужом компьютере
> и разработчик не имеет возможности отладить программу на
> этом компьютере?


Например, использовать unit JCLDebug из Jedi Library, взять его можно по адресу http://www.delphi-jedi.org, скачав оттуда библиотеку JCL - этот unit формирует log при падении программы на любом компьютере, с указанием адреса, где была ошибка и трассировкой стека.


> И так же понимаю, что врятли кто-то захочет анализировать
> несколько тысяч строк кода в поисках нестабильно появляющейся
> ошибки.


Лично я в таких случая тестирую программу по кускам, до тех пор, пока не убеждаюсь, что каждый кусок работает нормально по отдельности и куски корректно взаимодействуют между собой.

Удачи!



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.031 c
1-1093761619
DIS
2004-08-29 10:40
2004.09.12
функция которая переводит число в слова


1-1093386476
3APA3A
2004-08-25 02:27
2004.09.12
2 дополнительных потока при использовании TActionManager


14-1093272573
Копир
2004-08-23 18:49
2004.09.12
Лукашенку уговорили. Теперь он будет спать с "идеей".


1-1093829642
vovchik
2004-08-30 05:34
2004.09.12
Русская кодировка


4-1090914593
ASMiD
2004-07-27 11:49
2004.09.12
Программирование пультов ДУ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский