![]() |
Hat die MySQL oder die libmySQL.dll ein Memory Leak?
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,
Ich bin hier schier am verzweifeln. Da ein Dienst, den ich gebastelt habe, mal den Server lahmgelegt hat, habe ich auf den Speicherverbrauch geschaut. Oups ... jeder Aufruf der Datenbank routine kostet 4-16k. Es reicht aus, einfach nur dir Funktion open_fdd und close_fdd aufzurufen. Hier der entsprechende Code:
Delphi-Quellcode:
Die Funktion logdatei kann es nicht sein (ich hatte die schon einmal auskommentiert). Aber auch hier mal den Code anbei:
function open_fdd : PMySQL;
var _myCon: PMySQL; begin result := nil; try _myCon := mysql_init(nil); logdatei('Verbindungsdiscriptor initialisiert','mysql.log'); except _islog := true; logdatei('Irgendein Problem ' + mysql_error(_myCon),'mysql.log'); //beep; end; if _myCon = nil then begin logdatei('Nicht genug freier Speicher, um Verbindungsdeskriptor zu initialisieren','mysql.log'); Exit; end; if mysql_real_connect(_myCon, cMySQLhost, cMySQLuser, cMySQLpass, cMySQLdb, cMySQLport, nil, 0) = nil then begin logdatei('Die Verbindung konnte nicht hergestellt werden. Ursache: ' + mysql_error(_myCon),'mysql.log'); Exit; end; result := _mycon; end; function close_fdd(_myCon : PMySQL) : boolean; var _text : string; begin try mysql_close(_myCon); logdatei('DB sauber geschlossen','mysql.log'); except _islog := true; _text := mysql_error(_myCon); logdatei('Fehler beim Schliessen der DB: '+_text,'mysql.log'); end; result := true; end;
Delphi-Quellcode:
Wenn ich mit dem MemoryCheck rangehe, bekomme ich eine Virtual Alloc Meldung (siehe Sceenshot anbei).
function Logdatei(Text: string; filename : string) : Integer;
var LogFile: TextFile; TDTempStr: string; errorlevel : Integer; sDayDir : string; sMonthdir : string; sYearDir : string; _sAppDir : string; begin _sAppDir := ExtractFileDir(Application.ExeName); errorlevel := 0; // Keine Fehler sYearDir := _sAppDir+'\'+dateletters(inttostr(yearof(date))); sMonthDir := sYearDir+'\'+dateletters(inttostr(monthof(date))); sDayDir := sMonthDir+'\'+dateletters(inttostr(DayOfTheMonth(date))); if _islog then begin if not DirectoryExists(sYearDir) then CreateDir(sYearDir); if not DirectoryExists(sMonthDir) then CreateDir(sMonthDir); if not DirectoryExists(sDayDir) then CreateDir(sDayDir); if filename<>'startlog.log' then filename := sDayDir+'\'+filename else filename := _sAppDir+'\'+filename; try DateTimeToString(TDTempStr, 'dd.mm.yyyy hh:nn:ss', Now()); TDTempStr := TDTempStr + ': ' + Text; AssignFile(LogFile, filename); if not (FileExists(filename)) then begin Rewrite(logfile); end else begin Append(LogFile); end; Writeln(LogFile, TDTempStr); Flush(LogFile); CloseFile(LogFile); except errorlevel := 1; // Fehler end; end; result := errorlevel; end; function dateletters(_in : string) : string; begin _in := trim(_in); if length(_in) = 1 then result := '0' else result := ''; result := result + _in; end; Hat da mal jemand eine Idee? Gruss EL |
Re: Hat die MySQL oder die libmySQL.dll ein Memory Leak?
Die Funktion open_fdd ruft einige andere Funktionen auf.
Evtl ist dort das Speicherloch begraben? Ein guter Kandidat wäre z.B. mysql_init. Oder Du suchst bei dir in der Applikation nach dem Fehler. Meistens sind solche Sachen "hausgemacht". |
Re: Hat die MySQL oder die libmySQL.dll ein Memory Leak?
Zitat:
die andere Funktion (logdatei) ists auf jeden Fall nicht. Gruss EL |
Re: Hat die MySQL oder die libmySQL.dll ein Memory Leak?
erst mal zum abklären:
ist open_fdd von Dir? Falls ja, dann könnte es an
Delphi-Quellcode:
liegen. Hier belegst Du Speicher und gibst ihn nicht wieder frei.
_myCon := mysql_init(nil);
|
Re: Hat die MySQL oder die libmySQL.dll ein Memory Leak?
Zitat:
Allerdings habe ich diese Funktion mehr oder weniger so as it is übernommen. Habe lediglich die Logs dazu gepackt. Was könnte denn wohl das "Gegenstück" zu mysql_init sein? ... das müsste ich ja dann in close_fdd aufrufen? Gruss EL |
Re: Hat die MySQL oder die libmySQL.dll ein Memory Leak?
das Pendant zu mysql_init ist laut MySQL-Doku mysql_close.
Zitat:
Kann der Fehler doch in einem anderen Programmteil liegen? Vielleicht dort, wo Du das open_fdd/close_fdd aufrufst? |
Re: Hat die MySQL oder die libmySQL.dll ein Memory Leak?
Zitat:
Gruss EL |
Re: Hat die MySQL oder die libmySQL.dll ein Memory Leak?
Hier noch ein paar Ungereimtheiten:
Wenn ich an dem Rechner was mache (Outlook starte, IE starte oder irgendwas anderes), dann geht der Speicherverbrauch dieses Proggies hoch und wird nicht wieder freigegeben. Der Rechner ist ein vor 5 Tagen frisch aufgesetztes XP Pro SP2 mit allen Hotfixes. Delphi ist das 2006 Enterprise mit allen Updates. Das gleiche Leak tritt aber auch an anderen Maschinen auf. So langsam krieg ich einen an der Waffel Gruss EL |
D2006 scheint ein Speicherleak zu haben!!!
Ein Testprogramm:
Eine leere Form. Auf diese Form zwei Buttons. Das ist alles. Compilieren, starten. - Mittels Taskmanager Speicherverbrauch beobachten .... mal auf die Buttons klicken, andere Programme starten .... Was ein Dreck .... Gruss EL |
Re: Hat die MySQL oder die libmySQL.dll ein Memory Leak?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz