Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.04.15;
Скачать: CL | DM;

Вниз

Вопрос по EurekaLog. В процедуру перехвата заходит 2раза, почему?   Найти похожие ветки 

 
OW ©   (2011-12-13 10:28) [0]

в проекте пишу:

procedure MyActionNotify(EurekaExceptionRecord: TEurekaExceptionRecord; EurekaAction: TEurekaActionType; var Execute: Boolean);
var
 SL: TStringList;
begin
 Execute := False; // чтобы не показывалось окно exception, юзера за монитором нет
 SL := TStringList.Create;
 SL.Text := EurekaExceptionRecord.LogText;
 SL.SaveToFile(
                ExtractFilePath(Application.ExeName) +
                "\RTK-exception-" +
                FormatDateTime("yyyy-mm-dd-hh-mm-ss", now) +
                ".txt"
              );
 FreeAndNil(SL);
 Sleep(1000);
end;

{$R *.res}
begin
 ExceptionActionNotify := MyActionNotify;     // Eureka
 Application.Initialize;
 Application.CreateForm(TfrmRTK, frmRTK);
 Application.Run;
end.

и на форме кнопка
procedure TfrmRTK.btnGetRTKClick(Sender: TObject);
begin
 raise Exception.Create("qqqqqq");
end;

В процедуру MyActionNotify входит два раза.
в каталоге приложения создается 2 файла,
под дебагером точка останова на первой строке (Execute := False;), тоже два раза срабатывает.

Почему два раза?


 
OW ©   (2011-12-13 10:56) [1]

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


 
©   (2011-12-13 12:41) [2]

опережая все посты - руки из жопы


 
OW ©   (2011-12-13 12:53) [3]

с этим мог бы не спешить, просто спросил бы, я бы и так сказал


 
OW ©   (2011-12-13 14:32) [4]

А предположения есть?
Уже пол-дня в 3х, да какой трех, 2х соснах - и не понимаю ничего
входит второй раз и все тут.

Создал новый проект, пишу

procedure MyActionNotify(EurekaExceptionRecord: TEurekaExceptionRecord; EurekaAction: TEurekaActionType; var Execute: Boolean);
var
 SL: TStringList;
begin
 form1.Caption := form1.Caption + "+";
 Execute := False;
 SL := TStringList.Create;
 SL.Text := EurekaExceptionRecord.LogText;
 SL.SaveToFile(
                "C:\111.txt"
              );

 FreeAndNil(SL);
end;

{$R *.res}
begin
 ExceptionActionNotify := MyActionNotify;     // Eureka
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.

============

procedure TForm1.btn1Click(Sender: TObject);
begin
  raise Exception.Create("dqqqqqqq");
end;


теперь три раза заходит


 
OW ©   (2011-12-13 14:36) [5]

procedure MyActionNotify(EurekaExceptionRecord: TEurekaExceptionRecord; EurekaAction: TEurekaActionType; var Execute: Boolean);
var
SL: TStringList;
begin
form1.Caption := form1.Caption + "+";
Execute := False;
SL := TStringList.Create;
SL.Text := EurekaExceptionRecord.LogText;
 SL.SaveToFile(
                "C:\111"+ FormatDateTime("hh-mm-ss",now) +".txt"
              );

 FreeAndNil(SL);
 Sleep(1100);
end;

и во всех трех файлах одно и тоже
Assembler Information:
-------------------------------------------------------------------
; Unit1.TForm1.btn1Click (Line=28 - Offset=1)
; -------------------------------------------
004A8258  mov     ecx, $004A8278                    ; "dqqqqqqq"
004A825D  mov     dl, $01
004A825F  mov     eax, dword ptr [Exception]
004A8264  call    SysUtils.Exception.Create
004A8269  call    System._RaiseExcept               ; <-- EXCEPTION


 
OW ©   (2011-12-13 14:47) [6]

ладно, пусть оттуда руки. Но как, черт возьми, второй раз не заходить?

Понятно, что можно if переменная then выйти на первой строчке написать, это не интересно :)


 
Компромисс ©   (2011-12-13 15:21) [7]

Попробуй заключить тело MyActionNotify в один try except.
Чтобы исключить ошибку в обработчике исключения.

Stacktrace что показывает?


 
OW ©   (2011-12-13 15:53) [8]

 try
   form1.Caption := form1.Caption + "+";
   Execute := False;
   SL := TStringList.Create;
   SL.Text := EurekaExceptionRecord.LogText;
   SL.SaveToFile(
                  "C:\111"+ FormatDateTime("hh-mm-ss",now) +".txt"
                );

   FreeAndNil(SL);
   Sleep(1100);
 except
   Sleep(1); // брейкпойнт поставлен, не сработал
 end;


Call Stack Information:
------------------------------------------------------------------------------
|Address |Module      |Unit        |Class |Procedure/Method            |Line |
------------------------------------------------------------------------------
|*Exception Thread: ID=3768; Priority=0; Class=; [Main]                      |
|----------------------------------------------------------------------------|
|004A8269|Project1.exe|Unit1.pas   |TForm1|btn1Click                   |28[1]|
|7E36BFFB|user32.dll  |            |      |NotifyWinEvent              |     |
|7E36BFF3|user32.dll  |            |      |NotifyWinEvent              |     |
|7C90ECBA|ntdll.dll   |            |      |RtlMultiByteToUnicodeN      |     |
|7C90EB94|ntdll.dll   |            |      |RtlAnsiStringToUnicodeString|     |
|7C90D328|ntdll.dll   |            |      |ZwFindAtom                  |     |
|7E36F642|user32.dll  |            |      |CallWindowProcA             |     |
|7C9010E0|ntdll.dll   |            |      |RtlLeaveCriticalSection     |     |
|7E36B8FE|user32.dll  |            |      |SendMessageW                |     |
|7E36B8BA|user32.dll  |            |      |SendMessageW                |     |
|7E36F658|user32.dll  |            |      |CallWindowProcA             |     |
|7E36F642|user32.dll  |            |      |CallWindowProcA             |     |
|7E36F891|user32.dll  |            |      |CallNextHookEx              |     |
|7E3694DA|user32.dll  |            |      |GetCapture                  |     |
|7E3696C2|user32.dll  |            |      |DispatchMessageA            |     |
|7E3696B8|user32.dll  |            |      |DispatchMessageA            |     |
|004A872A|Project1.exe|Project1.dpr|      |                            |37[4]|
|7C90DCB8|ntdll.dll   |            |      |ZwSetInformationThread      |     |
------------------------------------------------------------------------------


 
OW ©   (2011-12-13 16:10) [9]

первый и остальные два входа
окно CallStack

MyActionNotify(($A2ACF8, $4A8269, 2548, $142B68, $142A9C, "EurekaLog 6.1.01".... остальной текст, который пишется в файл

CallExceptionActionNotify(($A2ACF8, $4A8269, 2548, $142B68, $142A9C, "EurekaLog 6.1.01".... остальной текст, который пишется в файл

CallExceptionActionNotify_atShowingExceptionInfo

ExceptNotify($A2ACF8,???,True,0,0,nil,nil,rtLocal,4194304,aeNone,False,nil)

ExceptionManager($A2ACF8,$4A826E,rtLocal,4194304)

Hooked_VCLHandleException($A4CCE8,$A2A6D0)

Project1


 
Компромисс ©   (2011-12-13 17:18) [10]

Поставь breakpoint на

procedure TForm1.btn1Click(Sender: TObject);
begin
  raise Exception.Create("dqqqqqqq");
end;

Похоже, что она вызывается несколько раз


 
OW ©   (2011-12-13 17:27) [11]

не-а...

var
 d: Double;
begin
 try
  Sleep(1);
  //raise Exception.Create("dqqqqqqq"); тут был один проход
  d := 1/random(1);
  Sleep(1);
 except
   raise; // и тут был один проход
 end;
end;


 
OW ©   (2011-12-13 17:27) [12]

а файла три создались, идентичных


 
OW ©   (2011-12-13 17:28) [13]

ну т.е., опять три раза попали в перехватчик


 
OW ©   (2011-12-13 17:38) [14]

модуль ExceptionLog;
строка 15118
вот это место

             try
               repeat
                 if (GetCurrentThreadId = MainThreadID)
                   and (CanCallProcessMessages) and (IsDialogShowed) then ProcessMessages;

                 if (Global_CurrentEvent <> nil) then
тут, по идее , смотрят стоит ли обработчик юзера, правильно?
                 begin
                   try
{$IFDEF EUREKALOG_PROFILER}
                     mSecEventTemp := GetTickCount;
{$ENDIF}
                     try
                       TInternalProc(Global_CurrentEvent); // Call the event.
                     finally
                       Global_CurrentEvent := nil;
тут по идее снимается обработчик юзера
                     end;
{$IFDEF EUREKALOG_PROFILER}
                     mSecEventTemp := (GetTickCount - mSecEventTemp);
{$ENDIF}
                   except
                     // ...
                   end;
                 end;

                 Sleep(10);
               until (not Thread.Executing);

так вот выполнив снятие,
Global_CurrentEvent := nil;

он в следующий раз считает что
Global_CurrentEvent <> nil

и в этом цикле три или два раза ходит.


 
Компромисс ©   (2011-12-13 17:55) [15]


> он в следующий раз считает что
> Global_CurrentEvent <> nil


Потому что где-то в другом месте снова присваивается Global_CurrentEvent


 
Rouse_ ©   (2011-12-13 20:21) [16]

Так а чего разрабам не отпишешся на саппорт? Вроде наши ребята, gunsmoker один из авторов сабжа...


 
Германн ©   (2011-12-14 00:57) [17]


> Rouse_ ©   (13.12.11 20:21) [16]
>
> Так а чего разрабам не отпишешся на саппорт? Вроде наши
> ребята, gunsmoker один из авторов сабжа...

Во-первых +1. АА регулярно отвечает на вопросы в техподдержку. Сам лично спрашивал и получал ответы.
Во-вторых. Ник gunsmoker не зарегистрирован на ДМ. Зарегистрирован ник CodeMonkey. Что впрочем почти одно и то же.
В-третьих. (Ну это уже интимное.) У меня Эврика честно купленная.
P.S. Хотя АА обычно сначала отвечает, а потом иногда спрашивает про "честность". Но это на "Исходниках" или на "Винграде".


 
OW ©   (2011-12-14 12:12) [18]

Что-то вы не то делаете. Событие Action вызывается на каждое действие, как-то: показ диалога, сохранение в файл, закончили сохранять в файл, скрыли диалог и т.д. Действие указывается в параметре EurekaAction: TEurekaActionType.
Вы же никак не проверяете, что за событие возникло - неудивительно, что вы плодите файлы, ведь на одно исключение приходится множество событий.
См. справку с описанием события. 
Вообще, я подозреваю, что вы ошиблись: вам нужно не ExceptionActionNotify, а ExceptionNotify.
____________

Алексеев Александр Викторович


procedure MyActionNotify(EurekaExceptionRecord: TEurekaExceptionRecord; EurekaAction: TEurekaActionType; var Execute: Boolean);
var
 SL: TStringList;
begin

а происходит еще у меня оказывается
atSavingLogFile и atSavedLogFile

Правда, мне нужно именно ExceptionActionNotify, т.к. это тут для примера только

спасибо, АА !



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

Текущий архив: 2012.04.15;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.009 c
2-1324408115
Драйвер мыши
2011-12-20 23:08
2012.04.15
Способы программного управления мышью и клавиатурой


2-1324424597
Gu
2011-12-21 03:43
2012.04.15
overload в dll


2-1324469524
Шел мимо решил зайти
2011-12-21 16:12
2012.04.15
Button.Caption и цикл


15-1323462605
Юрий
2011-12-10 00:30
2012.04.15
С днем рождения ! 10 декабря 2011 суббота


15-1323808202
Юрий
2011-12-14 00:30
2012.04.15
С днем рождения ! 14 декабря 2011 среда