Speicheranzeige

  • Vermutlich auch wieder leicht zu finden, aber ich habe wirklich gesucht :rolleyes:

    Mein Notebook läuft ab und zu aus dem Speicher und stürzt ab. Muss nicht von meinem AutoIt_Script kommen, kann auch eine andere Ursache haben, wobei ich die Hardware schon getestet habe.

    Zur Nachverfolgung dachte ich an die Anzeige des vom Programm genutzten Speichers während der Laufzeit. Gibt es dazu eine Möglichkeit?

    Außerdem bin ich von früher gewöhnt, dass ich mir nach einem Compile die Größen des Programms und der Variablen anzeigen lassen konnte.

    :)

  • Hi,

    Anzeige des vom Programm genutzten Speichers während der Laufzeit.

    Strg-Alt-Entf drücken, dann Taskmanager auswählen.

    Im Reiter Prozesse den Spaltenkopf Arbeitsspeicher anklicken (ggf mit Rechtsklick auf die Spaltenüberschriften einschalten) sortiert nach den Programmen mit dem größten Speicher"verbrauch".

    AutoIt-Script starten, ggf Rechtsklick in die Taskleiste und "Fenster nebeneinander anzeigen" auswählen. Nun kann man schön zuschauen, wie oder ob das AutoIt-Script ggf sogar bei welcher Aktion, am Speicher"verbarauch" beteiligt ist...

  • Den TaskManager habe ich zum Testen immer dabei laufen, aber die Abstürze zeigen sich so, dass im Taskmanager vorher und nachher alles ok ist (z.B. Arbeitsspeicher nicht auf Vollanschlag).

    Das übliche Ereignis ist: Monitor wird schwarz und kommt nach 2 Minuten mit VGA Auflösung wieder oder, wenn nicht, Notebook aufklappen, dort erscheint wenig später das Bild, Notebook zu und der Monitor ist wieder da. Zwischendurch sehe ich den Task-Manager nicht, aber gehe davon aus, dass die Grafik, die dabei nicht unterbrochen ist, danach bei Arbeitsspeicher immer noch ein wenig Platz nach oben anzeigt.

    Kann alles Mögliche sein, wie gesagt nicht unbedingt mein Programm. Bildschirmtreiber, Webdriver etc. kommen auch in Frage. Passiert oft, wenn ich nach Chrome oder Edge den Firefox öffne übers Script - dummerweise aber nicht reproduzierbar.

    Daher meine Idee, die Daten mal eine Zeitlang mitzuloggen. _WinAPI_GetProcessMemoryInfo werde ich dazu einbauen und die Werte in eine Datei schreiben.

    Nach der Testphase werde ich vermutlich den Einsatz auf Chrome oder Edge beschränken und den Firefox nur in Notfällen zulassen. Dabei stört allerdings sehr, dass nach jedem Update von Chrome oder Edge ein neuer passender Webdriver gesucht werden muss. Firefox ist da nicht so stressig, die letzte alte Version des Geckodrivers läuft auch mit aktualisierten Versionen. Gibt es hier übrigens jemanden mit Erfahrung mit den Webdrivern für spezielle Fragen?

    Danke für die Tipps!

    Alle drei Browser offen:

    :)

  • Es gibt unfreundlicherweise Webseiten, speziell unter denen, die mein Programm nutzt, wo die regelmäßig erforderliche Änderung des Passworts mit dem Firefox nicht funktioniert und wo man IE oder Edge nehmen muss - schlecht programmiert, aber ist halt so. Ich habe daher das Programm für alle drei Browser gemacht um solchen Fällen vorzubeugen. Oder für den Fall wie bei MozRepl, dass irgendwann mal irgendeiner der drei nicht mehr funktioniert mangels Support.

    :)

  • Noch mal zum Problem zurück, da neues Problem gefunden: Ich möchte den Verlauf der Arbeitsspeichernutzung eines Programms loggen.

    Ich ermittle die PID meines Programms mit:

    $iPid = WinGetProcess("AutoIt")

    dann hole ich die Speicherwerte mit

    $aData = _WinAPI_GetProcessMemoryInfo($iPid)

    und nehme den Wert 9

    $iMem = $aData[9] ; 'Current private space'

    Ich hätte jetzt gedacht, dass 'Current private space" der Wert ist, den der Taskmanager anzeigt unter Arbeitsspeicher, ist aber nicht so: Taskmanager 41,4MB und $iMem 44,46MB

    Was mache ich falsch? Ist 'Current private space' nicht der "Arbeitsspeicher" aus dem Taskmanager?


    :)

  • Fast hätte ich gesagt, das dies ein Fehler in der Umrechnung ist (1000 anstatt 1024) aber um von 44,46MB auf 41,4MB zu kommen braucht es 3*1024. Also:

    44,46 * 1000 * 1000 * 1000 /1024 /1024 /1024 = 41,4

    Aber MB wäre nur 2 mal, außer es wird generell mit GB gerechnet und falls "0,X" raus kommt mit 1000 multipliziert wenn das Ergebnis ausgegeben wird:

    0,04446 * 1000 * 1000 * 1000 /1024 /1024 /1024 = 0,0414 -> weil 0, -> 0,0414 * 1000 = 41,4 als Ergebnis

    Wobei 41,4MB dann das richtige Ergebnis wäre.

  • Die 46616576 aus _WinAPI_GetProcessMemoryInfo() sind laut Hilfe Byte. Im Beispiel steht:

    Function _WinAPI_GetProcessMemoryInfo

    Code
    ConsoleWrite('Current private space: ' & $aData[9] & ' bytes' & @CRLF)

    Ich habe gerechnet 46616576 / 1024 / 1024 = 44,46. Deine Rechnung ausgehend von 44,46 verstehe ich daher nicht. Von diesem Wert noch mal umzurechnen macht doch keinen Sinn?

    :)

  • Nein, es war nur eine Vermutung da häufig fälschlicherweise mit 1000 anstatt 1024 gerechnet wird.

    Mein Beispiel bezog sich jedoch nur auf die beiden Zahlen 44,46 und 41,4. Ggf. war es nur Zufall das es so passte.

    Aber ist [9] denn Korrekt, also das was du wirklich willst? Was steht im Rest des Arrays?

    Einmal editiert, zuletzt von Moombas (11. Mai 2021 um 12:17)

  • Ich möchte den Wert aus dem Taskmanager loggen:

    Hier sind die Ergebnisse von _WinAPI_GetProcessMemoryInfo() (0-9) und MemGetStats() (10-16), wobei [7] und [9] mit 46,45 MB (gerechnet wie oben) der Anzeige im Taskmanager mit 38,1 MB diesmal noch "unähnlicher" sind. Ich habe den Verdacht, der Taskmanager zieht andere Werte. Speziell ist er zwischen den beiden Abfragen von 44,1 MB auf 38,1 MB gewechselt, mein Log ist aber gleich geblieben:

    :)

  • Ein Test bei mir kommt gar nicht hin.

    Row 9 sagt 74498048 = 71,05 MB

    Wobei der Taskmanager sagt: 16.580 K = 16,19MB (sofern das K hier für 1024 und nicht 1000 steht, sonst: 15,81MB)

  • Zum Hintergrund:

    Ich habe ursprünglich in einer Endlosschleife ein GUI immer wieder neu definiert und damit laufend mehr Speicher verbraucht bis zum Platzen. Den Fehler habe ich gefunden. Jetzt ist aber immer noch ein stetiger geringer Speicherzuwachs geblieben, dem ich gerne auch auf die Spur kommen möchte. Inzwischen ist es so wenig, dass das Programm auch nach 8 Std. nicht abstürzt, aber mich interessiert halt, wieso [9] stetig steigt, dann gelegentlich mal wieder etwas runtergeht, in Summe aber trotzdem steigt.
    Nennen wir es "wissenschaftliches Interesse".

    Ich denke, die beiden Funktionen liefern tatsächlich nicht den Wert "Arbeitsspeicher" aus dem Taskmanager. Vielleicht bedeutet ein Anstieg in [9] auch nichts, da der Taskmanager andere Werte anzeigt. Aber es muss doch eine Möglichkeit geben, den Wert aus dem Taskmanager exakt zu bekommen!?

    :)

  • Nein, es war nur eine Vermutung da häufig fälschlicherweise mit 1000 anstatt 1024 gerechnet wird.

    Das führt dazu, dass Hersteller z.B. Festplattenkapazitäten (auch absichtlich, d.h. unter Inkaufnahme einer Fehlinterpretation) 'größer' darstellen.

    SI-Präfixe wie Kilo, Mega, Giga, Tera, sind für die Verwendung im Internationalen Einheitensystem (SI) definierte Dezimalpräfixe. Sie basieren auf Zehnerpotenzen mit ganzzahligen Exponenten.

    (siehe : Vorsätze für Maßeinheiten )

    • Kilo = 103 = 1000
    • Mega = 106 = 1000.000
    • Giga = 109 = 1000.000.000
    • Tera = 1012 = 1000.000.000.000

    In der Datenverarbeitung werden SI-Präfixe auch für Datenmengen (Bits und Bytes) verwendet, allerdings oft in der Bedeutung als Binärpräfix (Vielfache von 1024, z. B. 210, 220, 230 usw.).

    Beispiel : Ein Kibibyte wird geschrieben als 1 KiB = 210 B = 1024 B, wobei B für Byte steht.

    Damit können viele wohl nichts anfangen.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Der Ressourcenmonitor ist dort auch etwas unterschiedlich. Meine Vermutung wäre, dass der Taskmanager eventuell nur die absolute Arbeitsspeicher Nutzung anzeigt, nicht aber, wenn Daten in den swap ausgelagert werden. Normal passiert das ja nur, wenn der Arbeitsspeicher zu wenig wird, teilweise wird das aber auch mit Teilen der benötigten Ressourcen gemacht, welche nie genutzt werden.

    Aber wenn es dir darum geht, memory leaks zu finden würde ich einen anderen Ansatz nehmen:
    Alles durchschauen, ob man selbst Arbeitsspeicher allociert und nicht wieder freigibt. Wenn dort alles ausgeschlossen werden kann würde ich als nächstes UDFs verdächtigen und zu guter letzt AutoIt selbst (da kann man nur leider dann nichts mehr machen) ;)
    Im zweifel das Programm in Abschnitte aufteilen (normalerweise hat man ja eh viele funktionen,...) die einzeln getestet werden können und diese dann härtetests unterziehen => Sehr oft ausführen und die Arbeitsspeichernutzung ansehen.

    MfG Kanashius

  • Im Zweifel das Programm in Abschnitte aufteilen (normalerweise hat man ja eh viele Funktionen,...) die einzeln getestet werden können und diese dann Härtetests unterziehen => Sehr oft ausführen und die Arbeitsspeichernutzung ansehen.

    Genau das versuche ich ja. Aber stundenlang etwas Klicken und dabei in den Taskmanager schauen ist langweilig. Daher der Gedanke, den genutzten Arbeitsspeicher an verschiedenen Stellen im Programm zu loggen und dann nach ein paar Stunden normaler Arbeit zu schauen, ob es in Summe an diesen Stellen aufwärts geht.

    Und dafür brauche ich einen sinnvollen Wert, den ich automatisch aus dem System ziehen kann. Der muss noch nicht mal der "echte" Wert sein, sondern nur die Speicherbedarf-Änderungen dokumentieren.

    :)

  • Hallo HansJ54,

    ich habe nichts ausprobiert oder so. Daher rede ich nicht mit Wissen. Ich habe mir einfach bei deinem Screenshot gedacht, dass er wenig Sinn macht. Arraydisplay gibt dir einen Screenshot...

    Lass dir besser über eine gewisse Zeit in kürzeren Abständen die Daten in die Konsole ausgeben und vergleiche diese Daten mit dem Taskmanager.

    Grüße autoiter

  • Ich sammle die Werte, sieht dann so aus wie im Screenshot nur mit größeren zeitlichen Abständen. Wenn ich sicher wäre, dass es Row 9 ist, würde ich eine neue Spalte nur bei jeder Änderung von Row 9 erzeugen.

    Ich habe nach wie vor einen Speicherzuwachs, allerdings gering, sieht man sogar bei diesen kurzen Intervallen und hat nichts mit dem Aufbau der Tabelle zu tun, ab Col10 schreibe ich nur noch in Col10 und auch dabei steigt Row 9 leicht an.

    Im laufenden Programm zeige ich mir den Wert von Row 9 auch an:

    :)