Форум: "Начинающим";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];
ВнизПомогите найти AV Найти похожие ветки
← →
Kolan © (2007-02-21 12:37) [0]Здравствуйте,
при закрытии приложения получаю AV. Приложения довольно сложно(для меня). AV выскакивает если подключен плагин.
Отладкой проходился везде где только можно, но так и не нашел причину.
Затем поставил флаг NotifyOnExceptions и при завершении получаю сообщения что мол AV. Говорю "Break" но на код не попадаю. Если посмотреть CPU окно то там будет:74E10B09 ????
74E10B0A ????
74E10B0B ????
74E10B0C ????
74E10B0D ????
74E10B0E ????
74E10B0F ????
74E10B10 ????
74E10B11 ????
74E10B12 ????
74E10B13 ????
74E10B14 ????
74E10B15 ????
74E10B16 ????
74E10B17 ????
74E10B18 ????
74E10B19 ????
74E10B1A ????
74E10B1B ????
74E10B1C ????
74E10B1D ????
Если теперь нажать F8, будет: и стрелка будет стоять на 5203C160 E82397FFFF call $52035888
Нажимая F8 дальше попадаю на 5203C16A C3 ret и все останавливается, дальше не идет.TWinControl.MainWndProc:
5203C124 55 push ebp
5203C125 8BEC mov ebp,esp
5203C127 51 push ecx
5203C128 53 push ebx
5203C129 56 push esi
5203C12A 57 push edi
5203C12B 8945FC mov [ebp-$04],eax
5203C12E 33C0 xor eax,eax
5203C130 55 push ebp
5203C131 687CC10352 push $5203c17c
5203C136 64FF30 push dword ptr fs:[eax]
5203C139 648920 mov fs:[eax],esp
5203C13C 33C0 xor eax,eax
5203C13E 55 push ebp
5203C13F 686BC10352 push $5203c16b
5203C144 64FF30 push dword ptr fs:[eax]
5203C147 648920 mov fs:[eax],esp
5203C14A 8B5DFC mov ebx,[ebp-$04]
5203C14D 8B433C mov eax,[ebx+$3c]
5203C150 FF5338 call dword ptr [ebx+$38]
5203C153 33C0 xor eax,eax
5203C155 5A pop edx
5203C156 59 pop ecx
5203C157 59 pop ecx
5203C158 648910 mov fs:[eax],edx
5203C15B 6872C10352 push $5203c172
5203C160 E82397FFFF call $52035888
5203C165 E836F8FAFF call $51feb9a0
5203C16A C3 ret
5203C16B E94050FAFF jmp $51fe11b0
5203C170 EBEE jmp $5203c160
5203C172 33C0 xor eax,eax
5203C174 5A pop edx
Причем каждый раз поразному :(. Вот еще вариант CPU окна.
Тут останавливается на 51F06E29 8B8800000000 mov ecx,[eax+$00000000].@HandleFinally:
51F06DC8 8B442404 mov eax,[esp+$04]
51F06DCC F7400406000000 test [eax+$04],$00000006
51F06DD3 0F848F000000 jz $51f06e68
51F06DD9 53 push ebx
51F06DDA 31DB xor ebx,ebx
51F06DDC 56 push esi
51F06DDD 57 push edi
51F06DDE 55 push ebp
51F06DDF 55 push ebp
51F06DE0 68486EF051 push $51f06e48
51F06DE5 64FF33 push dword ptr fs:[ebx]
51F06DE8 648923 mov fs:[ebx],esp
51F06DEB 648B1B mov ebx,fs:[ebx]
51F06DEE 8B5018 mov edx,[eax+$18]
51F06DF1 8B4814 mov ecx,[eax+$14]
51F06DF4 53 push ebx
51F06DF5 50 push eax
51F06DF6 52 push edx
51F06DF7 51 push ecx
51F06DF8 8B7C2434 mov edi,[esp+$34]
51F06DFC E8633C0000 call $51f0aa64
51F06E01 FFB000000000 push dword ptr [eax+$00000000]
51F06E07 89A000000000 mov [eax+$00000000],esp
51F06E0D 8B4F04 mov ecx,[edi+$04]
51F06E10 8B6F08 mov ebp,[edi+$08]
51F06E13 C74704486EF051 mov [edi+$04],$51f06e48
51F06E1A 83C105 add ecx,$05
51F06E1D E88EFCFFFF call $51f06ab0
51F06E22 FFD1 call ecx
51F06E24 E83B3C0000 call $51f0aa6451F06E29 8B8800000000 mov ecx,[eax+$00000000]
Че делать я незнаю тк AV происходит не на нормальном коде...
И AV всегда по одному и томуже адресу.
← →
Desdechado © (2007-02-21 12:40) [1]Явно попытка освобождения уже освобожденных ресурсов.
Используй MemProof
← →
Kolan © (2007-02-21 13:41) [2]> Используй MemProof
C BDS 2006 не работает он, или уже работает? Пользуюсь встроенной проверкой..
Вот на что я грешу. Планин я разраатывал как простое приложение - так удобнее,
а потом просто покопировал модули в новый проект, который является пакетом и добавил всё что нужно для плагинов.
Может я с формаой что-то не так сделал:
проверье:procedure TTermoPlugin.StartPlugin;
begin
inherited;
if MainForm = nil then
MainForm := TMainForm.Create(nil);
if InfoForm = nil then
InfoForm := TInfoForm.Create(nil);
MainForm.Show;
TTermoPluginSystem.GetInstance.IsPuginMode := True;
MainForm.RelayCheckBox.Checked := True;
MainForm.IntervalEdit.Text := "2000";
MainForm.TermoCheckBox.Checked := True;
end;procedure TTermoPlugin.StopPlugin;
begin
inherited;
MainForm.Close;
end;
← →
Kolan © (2007-02-21 13:46) [3]Возможно, но не точно что ошибка происходит при удалении менеджера плагинов, при выгрузке пакета:
destructor TPluginCover.Destroy;
begin
if Assigned(FPlugin) then
begin
if Active then
FPlugin.StopPlugin;
FPlugin.Free;
end;
if FPluginHandle <> 0 then
begin
UnloadPackage(FPluginHandle);
FPluginHandle := 0;
end;
inherited;
end;
А вот часть плагина:initialization
KPluginManager.ClassManager.Add(TTermoPlugin);
finalization
KPluginManager.ClassManager.Remove(TTermoPlugin);
Те при UnloadPackage по идее попадаем на finalization.
Но это все не точно, тк при остановке(Break) строку где остановился отладчик не показывает...
← →
Kolan © (2007-02-21 13:48) [4]Точно проблема тут:
if FPluginHandle <> 0 then
begin
UnloadPackage(FPluginHandle);
FPluginHandle := 0;
end;
Если закоментить - все ок...
← →
Kolan © (2007-02-21 13:51) [5]
MemProof (Build 0.950 July 19, 2004) - ничего нового :(
For: Delphi 2, 3, 4, 5, 6, 7, 7.1; C++Builder 1, 3, 4, 5; and Borland C++ 5
Version .950 of MemProof now adds the following:Delphi 7.1 support
Я пробовал давно еще с BDS работает плохо...
← →
Kolan © (2007-02-21 14:52) [6]> Точно проблема тут:
> if FPluginHandle <> 0 then
> begin
> UnloadPackage(FPluginHandle);
> FPluginHandle := 0;
> end;
>
> Если закоментить - все ок...
Ну дык онечно просто если закомментить - все ок. И удаляю я тоже только при закрытии приложения, но этоже грех большой ресурсы не освобождать :) Откуда может быть ошибка?
← →
SlymRO (2007-02-21 14:57) [7]Оттуда, что кем то созданный объект уничтожается позже чем происходит выгрузка "плагина" в котором он реализован...
← →
Kolan © (2007-02-21 15:01) [8]> позже
Те сначала выгрузили, а потом кто-то удаляет... Вроде ошибка как раз при выгрузке.
← →
SlymRO (2007-02-21 15:09) [9]Kolan © (21.02.07 15:01) [8]
при выгрузке
А может сразу после? заведи в плагине счетчик созданных обектов...
в каждый Креат +1 в каждый Дестрой -1 и перед "выгрузкой смотри"
← →
SlymRO (2007-02-21 15:13) [10]SlymRO (21.02.07 15:09) [9]
счетчик созданных обектов
Получится типа DllCanUnloadNow из COM
← →
DrPass © (2007-02-21 15:13) [11]А этот KPluginManager существует в тот момент, когда срабатывает finalization?
> KPluginManager.ClassManager.Remove(TTermoPlugin);
← →
Kolan © (2007-02-21 15:23) [12]> KPluginManager
Это имя модуля.unit KPluginManager;
interface
uses
Classes;
type
TClassManager = class(TList);
function ClassManager: TClassManager;
implementation
var
Manager: TClassManager;
function ClassManager: TClassManager;
begin
Result := Manager;
end;
initialization
Manager := TClassManager.Create;
finalization
Manager.Free;
end.
← →
SlymRO (2007-02-21 15:28) [13]unit KPluginManager;
interface
uses
Classes;
type
TClassManager = class(TList);
function ClassManager: TClassManager;
implementation
var
Manager: TClassManager=nill;
function ClassManager: TClassManager;
begin
if not assigned(Manager) then
Manager := TClassManager.Create;
Result := Manager;
end;
initialization
finalization
if assigned(Manager) then
begin
if Manager.Count<>0 then
raise exception.Create("Не все плагины выгружены");
Manager.Free;
Manager:=nil;
end;
end.
← →
Kolan © (2007-02-21 16:01) [14]Да, синглетон тут странно ка-то сделан, я обычно делаю так как генерит встронный генератор(Create by pattern). А тут по статье сделал как там было написано...
Так таперь так:
Ставлю точку:finalization
if Assigned(Manager) then
begin
if Manager.Count<>0 then
raise Exception.Create("Не все плагины выгружены");
Manager.Free;
Manager:=nil;
end;
При закрытии попадаю в точку. Жму F8 почемуто попадаю сюда:procedure TTermoPlugin.StopPlugin;
begin
inherited;
MainForm.Close;
end;
Потом сюда:finalization
KPluginManager.ClassManager.Remove(TTermoPlugin);
Теперь сюдаfunction ClassManager: TClassManager;
begin
if not Assigned(Manager) then
Manager := TClassManager.Create;
Result := Manager;
end;
Снова сюда:finalization
if Assigned(Manager) then
begin
if Manager.Count<>0 then
raise Exception.Create("Не все плагины выгружены");
Manager.Free;
Manager:=nil;
end;
Сюда:
finalization
UIInfoRichEdit.Free;
Сюда:finalization
LogManager.Free;
Потом происходит AV и попадаю в код потока на Suspend:procedure TPackageExtractor.Execute;
begin
while not Terminated do
begin
if ReadIndex >= WriteIndex then
begin
//
LogManager.WriteString("Suspend");
//
Suspend;
← →
Kolan © (2007-02-21 16:02) [15]Конкретно показалось что AV теперь после inherited:
destructor TLogManager.Destroy;
begin
FCriticalSection.Free;
inherited;
end;
Что может быть не так? Мжет что то с файлами...TLogManager = class(TFileStream)
strict private
← →
Kolan © (2007-02-21 16:09) [16]Ой, каюсь - забыл пакет с KPluginManager; скопировать...
Сделал как:
SlymRO (21.02.07 15:28)
В итоге AV при старте приложения...
← →
Kolan © (2007-02-21 16:18) [17]Не опять аврал, не тот пакет скопировал.. :( Ошибка сохранилась.
Дело не в этом менеджере, тк если загрузить другой плагин(тестовый толко ShowMessage делает), то все нормально...
← →
SlymRO (2007-02-21 16:43) [18]Судя по всему ктото гасит TPackageExtractor, а TPackageExtractor "надеется" что все еще "загружено"
← →
Kolan © (2007-02-21 16:47) [19]> [18] SlymRO (21.02.07 16:43)
> Судя по всему ктото гасит TPackageExtractor, а TPackageExtractor
> "надеется" что все еще "загружено"
Да он сюда вообще отношения не имеет, по идее. Он пакеты из ком порта выбирает... Эх лана буду ковыряться....
← →
Kolan © (2007-02-21 16:49) [20]А может быть проблемма в том что и в плагине и в осн. приложении есть модули, которые называются одинаково? Может не так что-ник компилится...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.055 c