Stack wieder frei geben...



  • Hallo!

    Hab ein kleines Problem, bei dem ihr mir vielleicht helfen könntet...und zwar hab ich ein Programm welches den Stackvollschreibt und sich dann selbst beendet weil der Stack voll ist (sprich, es bricht sich wegen stackoverflow ab)....doch ich hab auf dieses Programm keinen Einfluß, doch ich kann mit hilfe einer shell ein weiteres Programm starten und beenden (welches ich nun schreiben will)...dieses Programm soll den Stack wieder leer machen...
    Doch nunstell ich mir die Frage...ist dies überhaupt möglich? da ich ja keine Anhaltspunkte hab was ich löschen will....und wäre dies mit C++ möglich....wenn ja? wie?...

    würde mich über jede Antwort freuen!

    MfG

    Muff



  • Wenn der Stack voll ist, dann wird dieser geleert, sobald der Bereich, in dem der Stack festgelegt wurde, seine Gültigkeit verliert, was auch gut das Programmende sein könnte.

    Oder wie machst du den Stack voll?

    MfG MAV



  • Das Programm ist Navision und besitzt eine eigene entwicklungsumgebung, doch hat man in dieser nicht die möglichkeit auf den speicher bzw so tief in die speicherverwaltung zu langen, doch ich muss eine datenbank mit 150 MB "clonen" (sag ich jetzt mal) und die befehle die ich nutze, um dies zu machen sind nicht für solche datenmassen vorbestimmt...da das was ich machen muss nichts normales in der navision welt is, deswegen muss ich mit einem externen programm irgendwie den stack leeren...das hat keinen einfluß auf die kopierte daten, da diese in dateien abgelegt werden, während er kopiert, doch nutzt er den stack solange bis er die funktion ausgeführt hat...und gibt den speicher auch dann erst wieder frei...also will ich die funktion anhalten (was möglich ist)und sprich mit einer shell dann meine exe an, welche den stack aufräumt...und sowas will ich in C/C++ machen....nur wie?...hab nun schon bißchen rumgelesen und gesucht, aber noch nichts sinnvolles gefunden...:(



  • Also keiner eine Idee?....hmpf 😞



  • Vielleicht hat keiner ne Idee, weil - technisch betrachtet - dein Vorhaben absoluter Humbug ist. (nein, nicht das CLonen der Daten, sondern das Leeren des Stacks)

    Da sträuben sich mir ja die Nackenhaare, wenn ich alleine schon den Satz "Den Stack leeren" lese. Weisst du überhaupt welche Funktion der Stack übernimmt?!? Sowas kann man nicht einfach "leeren" man kann höchstens dafür sorgen, dass die Datenmengen weniger schnell zunehmen.

    Der Stack wächst u.A. durch folgende Ursachen:

    • Tiefe Rekursivität
    • Viele/Grosse Strukturen die nicht auf dem Heap (new) sondern auf dem Stack erzeugt wurden

    -junix



  • vielleicht frage ich deswegen, weil mir selbst nichts dazu eingefallen ist?....aber danke für deinen tollen beitrag, ein einfaches, geht nicht...mir fällt dazu auch nix ein, hätte auch gereicht...und man kann blind in den stack schreiben, auch wenn man das nicht sollte...aber mach du auch erstmal deine grundlagen hausaufgaben und dann red weiter...



  • 😡



  • ...danke, ich glaube derart grundlegende Dinge habe ich doch seit ein- zwei, drei jahren Intus. Zumindest weiss ich mal, was mir den Stack füllen, und dass man Stack-Objekte/Variablen nicht einfach "freigeben" kann...

    Klar kannste im Stack rumpfuschen, allerdings kannste da nicht wirklich ein sinnvolles Ergebnis erwarten, da es nicht nur unschön ist, sondern weil schlicht ne Schrotflinte als Scharfschützengewehr verwendet wird. Von den ganzen (Laufzeit-)Sicherheits relevanten Aspekten mal abgesehen.

    ...aber danke für deinen tollen beitrag, ein einfaches, geht nicht...mir fällt dazu auch nix ein, hätte auch gereicht...

    Im Gegensatz zu deinem sinnlos arroganten "oh, er hat mich und meinen Ansatz in Frage gestellt, nu schlag ich einfach mal zurück und denk nacher vielleicht, wenns bequem ist mal nach"-Beitrag ("aber mach du auch erstmal deine grundlagen hausaufgaben und dann red weiter...") habe ich zumindest Punkte wo du ansetzen solltest/könntest aufgezeigt. Ahja übrigens: Vielleicht solltest du dich noch etwas genauer über Gültigkeitsbereiche informieren und mal prüfen ob du rausfindest, wann Stack Objekte/Variablen freigegeben werden. Das kann dir ebenfalls noch behilflich sein, die Datenmenge auf dem Stack zu reduzieren. btw: natürlich lässt sich die Stackgkrösse auch im Compiler einstellen. Allerdings solltest du dir etwas Gedanken machen, ob es wirklich sinnvoll ist, 1MB Daten (was die default-Einstellung beim MSVC ist, da weis sich sie grad zufällig) auf den Stack zu legen.

    -junix

    <edit>Zitat eingefügt</edit>



  • Muff schrieb:

    deswegen muss ich mit einem externen programm irgendwie den stack leeren...das hat keinen einfluß auf die kopierte daten, da diese in dateien abgelegt werden, während er kopiert, doch nutzt er den stack solange bis er die funktion ausgeführt hat...und gibt den speicher auch dann erst wieder frei...also will ich die funktion anhalten (was möglich ist)

    Da deine DB-Anwendung in einem virtuellen Speicherbereich liegt, auf welchen
    deine eigene Software keinen Zugriff hat, kannst du nicht mit einer externen
    Software im Stack rumpfuschen...
    Ich kenne Navision nicht, aber da gaebe es sicher eine elegantere Loesung fuer dein Problem...


Anmelden zum Antworten