Форум: "Прочее";
Текущий архив: 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