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

Вниз

Вопрос по 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.003 c
1-1291134936
tadalex
2010-11-30 19:35
2012.04.15
Размер панели в StatusBar e


2-1324499887
Антоха_М
2011-12-22 00:38
2012.04.15
Как видоизменить StringGrid?


15-1323698813
Andy BitOff
2011-12-12 18:06
2012.04.15
А завтра будет 13.12.11 10:09:08


1-1291613732
Gu
2010-12-06 08:35
2012.04.15
Шрифт заголовков груп в listview


4-1256327674
rubma
2009-10-23 23:54
2012.04.15
Память не может быть writen. В чем может быть проблема?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский