Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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 $51f0aa64
51F06E29 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.042 c
9-1143544075
STALIN
2006-03-28 15:07
2007.03.11
GLFreeform - GlScene как сделать так, чтобы через Freeform...


2-1171805222
GTR86
2007-02-18 16:27
2007.03.11
Как показать окна программ, запущенных пользователем?


15-1171479416
Вольный Стрелок
2007-02-14 21:56
2007.03.11
Отключить отладчик в системе


15-1171396436
Суслик
2007-02-13 22:53
2007.03.11
Вопрос по Excel - автоопределение высоты ряда


2-1171724058
Norfolk
2007-02-17 17:54
2007.03.11
TPageControl запись в поле Edit на второй вкладке.





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