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

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.038 c
1-1088953071
TUser
2004-07-04 18:57
2004.07.18
Не тот эксепшен Ж)


1-1089101589
Сергей_И
2004-07-06 12:13
2004.07.18
StringGrid удаление, вставка строк


1-1088748871
Роман
2004-07-02 10:14
2004.07.18
Исключения


14-1088585605
Паниковский
2004-06-30 12:53
2004.07.18
Лето! Сезон отпусков.


4-1086366053
Боян Георгиев
2004-06-04 20:20
2004.07.18
Mouse click emulation?





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