![]() |
[FastMM] Woher kommt UnicodeString Speicherleak?
Hallo zusammen,
seit geraumer Zeit setze ich FastMM ein, um Speicherleaks zu finden. Alle groben Fehler lassen sich damit ja prima aufdecken, nur habe ich zurzeit immer wieder Probleme mit UnicodeStrings. Im Moment sind es circa 20 Stellen, an denen scheinbar ein Speicherleak auftritt, nur wie kann ich diese finden? Ebenso interessant wäre es, woher diese kommen können!? Selbst alloziiere ich keinerlei Speicher für Strings, d.h. ich nutze nur var TmpStr: String;. |
AW: [FastMM] Woher kommt UnicodeString Speicherleak?
Mir sind keine Probleme bezüglich Memory-Leaks und UnicodeStrings bekannt. Wenn du ein Testprojekt zusammenstellen kannst wo das Problem auftritt, könnte man vielleicht weiterhelfen.
|
AW: [FastMM] Woher kommt UnicodeString Speicherleak?
Das Projekt selbst ist verdammt groß und ich nutze zudem auch Fremdkomponenten, d.h. das erschwert die Sache ungemein. Vielleichts gibt es ja eine Art Allheilmittel für sowas...
|
AW: [FastMM] Woher kommt UnicodeString Speicherleak?
nein, Allheilmittel gibt es keine. Aber Windows räumt nach dem Beenden des Prozesses kräftig auf, sodass auch alle Speicherlecks am Ende wieder weg sind. Problematisch wirds nur, wenn das Speicherleck häufig auftritt und das Programm mehr als 24h am Stück laufen wird. Dann kommt selbst der Windows-eigene Aufräummechanismus nicht zum tragen, weil der Prozess ja noch läuft und es sich immer mehr unerwünschter Müll ansammelt.
Bernhard |
AW: [FastMM] Woher kommt UnicodeString Speicherleak?
Zitat:
Auch problematisch sind threadvar-strings. Denn es gibt keinen Punkt im Code an dem man alle auf einmal auf '' zurücksetzen kann. |
AW: [FastMM] Woher kommt UnicodeString Speicherleak?
Das Windows am Ende vieles aufräumt (Aufgrund der getrennten Speicherberecher seit WinNT gut machbar) ist ja gut, aber dennoch sollte man nicht Schludern und möglichst aufräumen.
Ein böses Beispiel: Du nutzt seit Jahren einen Code, welcher ein bekanntes und absichtlich ignoriertes Speicherleck besitzt. (machte ja keine Probleme ... Windows räumt schon auf) Aber nun willst du diesen Code öfters in einem langzeitlaufenden Programm nutzen und peng. |
AW: [FastMM] Woher kommt UnicodeString Speicherleak?
Also sauber aufräumen will ich auf jeden Fall, weil das allein schon zu einem sauberen Programmierstil gehört. Mir geht das übelst gegen den Strich wenn eine Anwendung immer mehr Ressourcen frisst, wozu denn auch?! Nur weil der Programmierer eigentlich zu faul war.
@jbg: was verstehst du unter threadvar-strings.? Public String-Variablen in einer Thread-Klasse? |
AW: [FastMM] Woher kommt UnicodeString Speicherleak?
![]() PS: Hat jemand einen einfachen StackTrace-Code? Dann könnte ich eine einfachen LeckSuchCode zusammenstellen. Nur die letzte Aufrufstelle, welche den Speicher letzendlich reserviert hatte, sagt oftmals ja nicht viel aus. |
AW: [FastMM] Woher kommt UnicodeString Speicherleak?
Zitat:
Delphi-Quellcode:
Jeder Thread hat dabei seine eigene string-Variable. Und das ist nicht nur auf TThread Instanzen beschränkt.
threadvar
MyString: string; |
AW: [FastMM] Woher kommt UnicodeString Speicherleak?
Ich glaube ich hab den Fehler gefunden. Und zwar gibt es ja in der FastMM-Datei FastMM4Options.inc die Option FullDebugMode. Wenn ich diese Option aktiviere, so erzeugt FastMM je UnicodeString-Speicherleak einen Eintrag in die Datei . Hier ein Auszug:
Code:
Bisher habe ich noch nie auf das, was unter den Hexzahlen steht. Aber da steht ja sehr genau, wo das Problem liegt :) Der String, der auch hier zu lesen ist, kann ich nachverfolgen und bin somit auf das Log-Modul gestoßen, welches der Schuldige war *grml*
--------------------------------2010/6/9 19:18:55--------------------------------
A memory block has been leaked. The size is: 68 This block was allocated by thread 0x14B0, and the stack trace (return addresses) at the time was: 411ABA 404837 4084EE 4085A5 70CAE4 710269 7A4B47 7A5238 4C1B29 48DC4F 48E6B5 The block is currently used for an object of class: UnicodeString The allocation number is: 13604998 Current memory dump of 256 bytes starting at pointer address 7E7E5630: B0 04 02 00 01 00 00 00 17 00 00 00 38 00 37 00 30 00 20 00 44 00 61 00 74 00 65 00 6E 00 73 00 E4 00 74 00 7A 00 65 00 20 00 67 00 65 00 66 00 75 00 6E 00 64 00 65 00 6E 00 00 00 19 2D CB 78 80 80 80 80 80 80 80 80 00 00 00 00 A0 18 7E 7E 00 00 00 00 00 00 00 00 44 18 41 00 00 00 00 00 58 B3 D3 00 BA 1A 41 00 37 48 40 00 EE 84 40 00 A5 85 40 00 E4 CA 70 00 69 02 71 00 47 4B 7A 00 38 52 7A 00 29 1B 4C 00 4F DC 48 00 B5 E6 48 00 B0 14 00 00 16 48 40 00 F0 9E 40 00 27 D8 51 00 94 D3 51 00 6F 28 53 00 C9 2F 53 00 2C 07 71 00 BC CB 70 00 69 02 71 00 47 4B 7A 00 38 52 7A 00 B0 14 00 00 3A 00 00 00 00 00 00 00 FC 5F 5C 87 B0 04 02 00 01 00 00 00 16 00 00 00 38 00 32 00 20 00 44 00 61 00 74 00 65 00 6E 00 73 00 E4 00 74 00 7A 00 65 00 20 00 67 00 65 00 66 00 75 00 ° . . . . . . . . . . . 8 . 7 . 0 . . D . a . t . e . n . s . ä . t . z . e . . g . e . f . u . n . d . e . n . . . . - Ë x € € € € € € € € . . . . * . ~ ~ . . . . . . . . D . A . . . . . X ³ Ó . º . A . 7 H @ . î „ @ . ¥ … @ . ä Ê p . i . q . G K z . 8 R z . ) . L . O Ü H . µ æ H . ° . . . . H @ . ð ž @ . ' Ø Q . ” Ó Q . o ( S . É / S . , . q . ¼ Ë p . i . q . G K z . 8 R z . ° . . . : . . . . . . . ü _ \ ‡ ° . . . . . . . . . . . 8 . 2 . . D . a . t . e . n . s . ä . t . z . e . . g . e . f . u . |
AW: [FastMM] Woher kommt UnicodeString Speicherleak?
Zitat:
|
AW: [FastMM] Woher kommt UnicodeString Speicherleak?
Und wo geht das? :)
// edit Habs in der FastMM-Inc gesucht, ich Held :wall: // edit 2 @jpg: absolut klasse! Herzlichsten Dank, da erleichtert die Arbeit ungemein. |
AW: [FastMM] Woher kommt UnicodeString Speicherleak?
Hallo,
hm, ich habe die gleichen Probleme. Ein Haufen Unicode-Strings als MemLeaks. Aber wie bekommt man die weg ??? Heiko |
AW: [FastMM] Woher kommt UnicodeString Speicherleak?
Sollte die Delphi nicht voll automatisch aufräumen?
Bernhard |
AW: [FastMM] Woher kommt UnicodeString Speicherleak?
@rollstuhlfahrer: Naja, wenn du ein Objekt nicht freigibst, welches einen UnicodeString enthält, wird der String wohl auch nicht freigegeben. Würde alles normal ablaufen, dann gäbe es keinerlei Speicherleaks.
@hoika: Hast du schon via FastMM geschaut, wo genau die Speicherleaks auftreten? Gibt es neben den UnicodeString-Leaks noch weitere? Allozierst du selbst Speicher? (selbst wenn dieser evtl. wieder freigegeben wird) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 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-2025 by Thomas Breitkreuz