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

Вниз

Как узнать, где утечка памяти?   Найти похожие ветки 

 
kalishenko   (2004-06-07 11:34) [0]

При закрытии приложения вылетает "Runtime Error 217 at 40025354". Как определить, где в проге ошибка?


 
Плохиш   (2004-06-07 11:39) [1]


> "Runtime Error 217 at 40025354".


 
kalishenko   (2004-06-07 11:48) [2]

А как мне узнать, что именно по этому адресу находится (какая-нибудь переменная или еще что-нибудь). И что за ошибка 217?


 
Sam Stone ©   (2004-06-07 11:53) [3]

Ставишь на OnClose бряку и в пошаговый дебаг :)


 
GuAV ©   (2004-06-07 11:55) [4]

А это точно утечка памяти ?
Утечка памяти, imho, не проявляестся ни в каких runtime-error.
215 Arithmetic overflow (integer only) EIntOverflow
216 Access violation                   EAccessViolation
217 Control-C                          EControlC
218 Privileged instruction             EPrivilege
219 Invalid typecast                   EInvalidCast
220 Invalid variant typecast           EVariantError


вообще лучше подключи SysUtils и работяй с ошибками как с exception


> И что за ошибка 217?

А может 216? - тогда AV 8-)


 
kalishenko   (2004-06-07 12:01) [5]

Так в том-то и дело, что ошибка вылетает после всех процедур в OnClose, а именно после end. в проекте, т.е.

program CDep;

uses
 Forms,
 MainForm in "MainForm.pas" {InterfaceForm},
 DataModule in "DataModule.pas" {DataModule1: TDataModule},
 Plugins in "Plugins.pas" {PluginsForm};

{$R *.res}

begin
 Application.Initialize;
 Application.Title := "Відділ по роботі з клієнтами";
 Application.CreateForm(TInterfaceForm, InterfaceForm);
 Application.Run;
end. //после этого вываливается ошибка

Как я понял, просто где-то в проге выделял память, но при выходе не очистил. А где, не пойму. Если надо, могу выложить код проги.


 
kalishenko   (2004-06-07 12:09) [6]

>>GuAV
>>А это точно утечка памяти ?

Не уверен, но ничего больше в голову не приходит. А что это за Control-C?


 
evvcom ©   (2004-06-07 12:30) [7]


> где-то в проге выделял память, но при выходе не очистил

От этого ошибки могут выскакивать во время выполнения и связанные с нехваткой памяти (ресурсов и т.д.)
Для начала открой View/Debug Windows/Modules и посмотри, что сидит по 40025354?


 
kalishenko   (2004-06-07 13:13) [8]

По этому адресу 40025320 сидит TList.SetCapacity, а именно по адресу 40025354 89730С mov[ebx+$0C],esi. Вряд ли это что-то Вам говорит (по-крайней мере, мне точно не говорит). Лучше приведу код программы, может кто найдет ошибку:

type
 PProj = ^recProj;
 recProj = record
   ProjectName: string;// Название проекта/ФИО клиента
   Next: PProj;        // Следующая запись о проекте/клиенте
 end;

 PPlugin = ^TPlugin;
 TPlugin = record
   Filename: string;   // Имя файла
   Name: string;       // Полное название, отображаемое в TreeView
   IconIndex: word;    // Индекс иконки в ImageList
   Handle: integer;    // Хэндл загруженной DLL
   Loaded: Boolean;
   Next: PPlugin;      // Указатель на след. данные о плагине
 end;

var
 InterfaceForm: TInterfaceForm;
 config: TextFile;
 CurrProj: PProj;
 FirstPlugin: PPlugin = nil;
 ConfigStr: string;

implementation

uses DataModule, IBSQL, DB, IBStoredProc, Plugins;

{$R *.dfm}

procedure TInterfaceForm.N3Click(Sender: TObject);
begin
 Close;
end;

procedure TreeViewClear;
begin
 with InterfaceForm.TreeView.Items do
   if Item[0].Count <> 0 then
     Clear;
end;

procedure LoadPlugin(PluginName: Pchar; Description: string; IconID: word; ToLoad: Boolean);
var Plugin: PPlugin;
begin
 Plugin := New(PPlugin);
 with Plugin^ do
 begin
   Filename := PluginName;
   Name := Description;
   IconIndex := IconID;
   if ToLoad then
   begin
     //Handle := LoadLibrary(PluginName);
     if Handle <> 0 then Loaded := True
     else Loaded := False;
   end
   else
   begin
     Handle := 0;
     Loaded := False;
   end;
   Next := FirstPlugin;
 end;
 FirstPlugin := Plugin;
end;

procedure UnloadPlugins;
var Plugin: PPlugin;
   j: Boolean;
   k: integer;
begin
 Plugin := FirstPlugin;
 while Plugin <> nil do
 begin
   FirstPlugin := Plugin.Next;
   ConfigStr := Plugin.Filename;
   //if Plugin.Handle <> 0 then j := FreeLibrary(Plugin.Handle);

   if not j then k := GetLastError;

   Dispose(Plugin);
   Plugin := FirstPlugin;
 end;
end;

function SubstrFromString(delimiter_char: char): string;
var i: integer;
begin
 Result := copy(ConfigStr,1,pos(delimiter_char,ConfigStr) - 1);
 i := pos(delimiter_char,ConfigStr);
 Delete(ConfigStr,1,i);
end;

procedure TInterfaceForm.FormShow(Sender: TObject);
var SearchRec: TSearchRec;
   s: string;
begin
 TreeViewClear;

 AssignFile(config,ExtractFilePath(Application.ExeName) + "config.txt");
 Reset(config);

 while not Eof(config) do
 begin
   Readln(config, ConfigStr);
   if ConfigStr[1] <> ";" then
   begin
     if ConfigStr <> "<Plugins>" then
     begin
       s := SubstrFromString("=");
       if FindFirst(s + ".dll",faAnyFile,SearchRec) <> 0 then
         MessageBox(0,pchar("Подключаемый модуль " + s + ".dll не найден."),"Ошибка",MB_OK)
       else
       begin
         s := SubstrFromString("=");
         LoadPlugin(SearchRec.FindData.cFileName,s,strtoint(SubstrFromString(";")),True);
         TreeView.Items.AddChild(TreeView.Items.Item[0],FirstPlugin.Name).ImageIndex := FirstPlugin.IconIndex;

         TreeView.Select(TreeView.Items.Item[0].GetLastChild);
       end;
       //TreeView.Items.AddChild(TreeView.Items.Item[0],copy(ConfigStr,pos("=",ConfigStr) + 1,length(ConfigStr) - pos("=",ConfigStr) - 2)).ImageIndex := strtoint(copy(ConfigStr,length(ConfigStr),1));
     end
   end
   else
   begin
     s := copy(SubstrFromString("="),2,length(ConfigStr));;
     if FindFirst(s + ".dll",faAnyFile,SearchRec) <> 0 then
       MessageBox(0,pchar("Подключаемый модуль " + s + ".dll не найден."),"Ошибка",MB_OK)
     else
     begin
       s := SubstrFromString("=");
       LoadPlugin(SearchRec.FindData.cFileName,s,strtoint(SubstrFromString(";")),False);
     end;
   end;
 end;
 FindClose(SearchRec);
 TreeView.AutoExpand := True;
end;

function LoadProject(Project: PProj; Value: string): PProj;
begin
 CurrProj := New(PProj);
 with CurrProj^ do
 begin
   ProjectName := Value;
   Next := Project;
 end;
 Result := CurrProj;
end;

function SelectRecords(Query_text: string; Project: PProj): PProj;
begin
 DataModule1 := TDataModule1.Create(Application);
 with DataModule1.IBSQL do
 begin
   Close;
   SQL.Clear;
   SQL.SetText(pchar(query_text));
   ExecQuery;

   while not Eof do
   begin
     Project := LoadProject(Project,VarToStr(Fields[0].Value));
     Next;
   end;
 end;
 DataModule1.Free;
 Result := Project;
end;

procedure TInterfaceForm.All_projects;
begin
 {Application.CreateForm(TDataModule1, DataModule1);

 with DataModule1.IBSQL do
 begin
   Close;
   SQL.Clear;
   SQL.SetText("SELECT CMP_NAME FROM PAYPROJECT");
   ExecQuery;

   while not Eof do
   begin
     ListView.Items.Add.Caption := VarToStr(Fields[0].AsVariant);
     for i := 1 to Current.Count - 1 do
       ListView.Items.Item[RecordCount - 1].SubItems.Add(VarToStr(Fields[i].AsVariant));
     Next;
   end;
 end;

 Application.FreeNotification(DataModule1);  }

 with TreeView.Selected do
 begin
   if Data = nil then
   begin
     {case AbsoluteIndex of
       1: Data := SelectRecords("SELECT CMP_NAME FROM PAYPROJECT",Data);
       2: Data := SelectRecords("SELECT SHORTNAME FROM TEMP1",Data);
     end;}
     case ImageIndex of
       1: Data := SelectRecords("SELECT CMP_NAME FROM PAYPROJECT",Data);
       2: Data := SelectRecords("SELECT SHORTNAME FROM TEMP1",Data);
     end;
   end;

   CurrProj := Data;
   while CurrProj <> nil do
   begin
     ListView.Items.Add.Caption := CurrProj.ProjectName;
     CurrProj := CurrProj.Next;
   end;
 end;
end;

procedure TInterfaceForm.TreeViewChange(Sender: TObject; Node: TTreeNode);
begin
 ListView.Items.Clear;
 All_projects;
 TreeView.Selected.SelectedIndex := TreeView.Selected.ImageIndex;
end;

procedure UnLoadProjects;
var i: integer;
   Project: PProj;
begin
 for i := 0 to InterfaceForm.TreeView.Items.Count - 1 do
 begin
   CurrProj := InterfaceForm.TreeView.Items.Item[i].Data;
   while CurrProj <> nil do
   begin
     Project := CurrProj.Next;
     Dispose(CurrProj);
     CurrProj := Project;
   end;
 end;
end;

procedure TInterfaceForm.FormCloseQuery(Sender: TObject;
 var CanClose: Boolean);
var i: integer;
begin
   UnLoadProjects;
   UnloadPlugins;
end;

procedure TInterfaceForm.Plugins1Click(Sender: TObject);
begin
 PluginsForm := TPluginsForm.Create(Application);
 PluginsForm.ShowModal;
 PluginsForm.Free;
end;

end.


 
GuAV ©   (2004-06-07 14:21) [9]

TPlugin = record
  Filename: string;   // Имя файла
  Name: string;       // Полное название, отображаемое в
у меня есть подозрения, что при Dispose эти string не освободятся. Попробуй перед dispose их обулять Name:=""


 
kalishenko   (2004-06-07 14:44) [10]

Все-равно не помагает.


 
kalishenko   (2004-06-07 15:12) [11]

Все, нашел. Объявил впустую ShareMem. Из-за нее и выскакивала проклятая ошибка. Так теперь другая проблема - не выгружается загружаемая мною библиотека, т.е. после FreeLibrary вываливается дебаггер и говорит "Project c:\cdep\cdep.exe raised too many consecutive exceptions: access violation at 0x00000000 ..." Может быть проблема в библиотеке?



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

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

Наверх




Память: 0.51 MB
Время: 0.053 c
3-1087823153
Митяй
2004-06-21 17:05
2004.07.18
ADO "Чудеса в решете"


4-1086339528
SigalX
2004-06-04 12:58
2004.07.18
Смена активного привода CD


14-1088430584
ProstoMan
2004-06-28 17:49
2004.07.18
В моей программе создается много потоков...


6-1084894484
Slider
2004-05-18 19:34
2004.07.18
Закрытие порта


3-1087885186
Top100
2004-06-22 10:19
2004.07.18
Insert into ????