Fragensteller
Probleme mit dem DebugHeap (glaub ich)

Frage
-
Hallo Leute...
Der DebugHeap ist ja normal schon was gutes (ich nehme mal an, von ihm kommen diese 0xcdcd und 0xfeee Muster und nicht von der CRT). Ich lass den daher beim Debuggen immer mitlaufen. Aber... bei unseren Langzeittest (wir führen mehrer Millionen Operationen auf unserer Datenbank durch), da beobachten wir immer wieder sehr sehr seltsame Dinge. Wir hatten z.B. das Problem, dass in früheren Test die Speicher-Belegung dauernd hoch ging (sah aus wie ein Leak). Und erst als er den physikalischen Speicher fast voll hatte, wurde wieder was freigegeben. Manchmal jedoch nicht und... ja, ihr kennt das... Speicher voll, Zeug auf die Harddisk, alles wird zum Gähnen langsam... da muss man den Test abbrechen. Wir hatten dies aber meistens nur dann, wenn wir riesen Arrays allozierten und wieder freigaben... also haben wir das nicht mehr gemacht, sondern den Speicher recyclet (das war Speicher, den wir nur für Verifikationen der Datenbank nutzten, wären also in der Release nicht drin gewesen, daher hatten wir das nicht optimiert). ... das Verhalten des neuesten Programms ist aber viel verherender. Unser Programm alloziert häufig kleine Blöcke und gibt die wieder frei (Jobs werden erstellt, zusammengebaut, übergeben, ausgeführt, abgebaut... genauso ist das mit Objekten im Cache, die werden gebaut, behalten und irgendwann wieder entladen) ... das ist eigentlich normales Verhalten (logo, man könnte den Speicher zu recyclen versuchen, aber... der ist oft ungleich lang und daher eigentlich mehr das wozu eine Speicherverwaltung gebaut sein müsste) ... also, auf jeden Fall allozieren wir viel und geben viel frei... und jetzt schnellen die Laufzeiten plötzlich hoch. Nach einigen Millionen Operationen dauert ein malloc/free plötzlich einige zehntausend (10'000) mal länger als normal... oft hängt der Heap in irgendwelchen internen Locks für recht lange Zeit... hat da einer Erfahrung damit was man am besten tut dagegen? (ausser den DebugHeap abschalten) ... das ist doch echt sau blöd...
Rudolf
Alle Antworten
-
Ich habe selbst bei Diensten, die 24*7 im Test im Debug-Heap fahren noch nie solche Probleme gehabt.
Wenn viel in kurzer zeit allokiert wird würde ich aber mt _CRTDBG_DELAY_FREE_MEM_DF vorsichtig sein.
Welche Flags setzt Ihr denn?
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
-
Dann lies Dir mal die Beschreibung der Flags durch und setze nur die die Du möchtest...
Alleine von der Funktionsweise kann _CRTDBG_DELAY_FREE_MEM_DF einfach zu einem stark erhöhten Speicherverbrauch führen.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
-
Es ist nur _CRTDBG_ALLOC_MEM_DF gesetzt... aber viel interessanter finde ich ja, dass sich die CRT und Windows selber je nach Version ganz anders verhalten. ... das mit dem Zusammenbruch der Leistung halte ich aber noch immer für einen Bug. Aber evtl. lässt sich das ja etwas abschwächen, wenn ich klären könnte, ob ein Low-Fragmentation-Heap verwendet wird oder nicht... oder aber (und dazu tendiere ich je länger je mehr), ich schreibe gleich selber eine Memory- Verwaltung und hol alles per VirtualAlloc... schliesslich kann der Heap von Windows das ja auch nicht anders machen und wenn ich das täte, dann wüsste ich wenigstens was da abgeht. Ich könnte sowieso gleich vollständig auf die CRT verzichten, weil mir nichts einfällt, was ich noch von der CRT nutze...
-
Sehr interessant ist z.B., dass Debug/Release mit angehängtem Debugger immer OHNE LowFragmentation-Heap arbeiten, Debug ohne Debugger auch, jedoch Release ohne Debugger MIT LowFragmentation-Heap arbeitet. Und wenn ich _NO_DEBUG_HEAP definiere für Debug/Release mit angehängtem Debugger, dann arbeitet die Debug-Version weiterhin OHNE LowFragmentation, während die Release MIT LowFragmentation arbeitet...
Das heisst... dass ich nicht so richtig weiss, wieso es zu meinem Fehler kommt, bzw. wieso es manchmal nicht dazu kommt. Eine Debug-Version ist das immer. Wieso also hab ich mit dem _NO_DEBUG_HEAP eine Veränderung auslösen können? ... weil's wohl noch an anderem liegt. Und da sehen wir leider nicht wirklich durch... also geb ich's lieber gleich auf und starte das Projekt "C++ Programm ohne CRT" :-) ist auch mal interessant...