Форум: "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.033 c