Stapel-/Stacküberlauf

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Stapel-/Stacküberlauf

Beitrag von 7x7 »

Hallo Freunde,

gibt es eine Möglichkeit, den Stack zu erweitern? (auch illegale Methoden werden akzeptiert :mrgreen: )

Habe mal wieder ein kleines BruteForce-Progrämmchen geschrieben, welches ausgiebig rekursiv arbeitet. Kaum gestartet meldet er Stapel-/Stacküberlauf. Lokale Variablen habe ich schon auf ein Minimum reduziert.

Mein System: XP(32), 4GB-RAM, PB 4.50
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Stapel-/Stacküberlauf

Beitrag von DarkDragon »

Üblich ist es einen Stack selbst zu programmieren (In PB z.B. eine Liste). Das geht relativ schnell.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Stapel-/Stacküberlauf

Beitrag von Danilo »

7x7 hat geschrieben:gibt es eine Möglichkeit, den Stack zu erweitern? (auch illegale Methoden werden akzeptiert :mrgreen: )
Bei den Compileroptionen kannst Du ganz unten ein
"Linker options file" angeben, für polink.
Und bei Polink ist die Option "/STACK:reserve[,commit]".

Default ist meist 1MB Stack reserviert, also probier mal
im Linker options file:
/STACK:2097152
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Stapel-/Stacküberlauf

Beitrag von 7x7 »

DarkDragon hat geschrieben:Üblich ist es einen Stack selbst zu programmieren (In PB z.B. eine Liste). Das geht relativ schnell.
Aber wirklich NUR wenn gar nichts anderes mehr geht.

@Danilo:
Das klingt gut, verstehe aber nicht so ganz genau, was ich wo tun muss.

Existiert dieses "Linker options File" schon irgendwo oder muss ich das anlegen? (Habe nachgesehen im "Compiler"-Ordner, konnte nichts dergleichen finden.) Wenn ich das selbst anlegen soll - muss das File (sicherlich) einen bestimmten Namen haben?
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Stapel-/Stacküberlauf

Beitrag von Danilo »

7x7 hat geschrieben:@Danilo:
Das klingt gut, verstehe aber nicht so ganz genau, was ich wo tun muss.

Existiert dieses "Linker options File" schon irgendwo oder muss ich das anlegen? (Habe nachgesehen im "Compiler"-Ordner, konnte nichts dergleichen finden.) Wenn ich das selbst anlegen soll - muss das File (sicherlich) einen bestimmten Namen haben?
Eigene Datei, z.B. d:\polink.txt:

Code: Alles auswählen

/STACK:2097152
In den Compileroptionen bei "Linker options file": d:\polink.txt
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Stapel-/Stacküberlauf

Beitrag von bobobo »

PB-Hilfe hat geschrieben:Linker-Optionen Datei
Hier kann eine Text-Datei definiert werden mit weiteren Kommandozeilen-Optionen, welche beim Erstellen des Executable an den Linker übergeben werden sollen. Die Datei sollte eine Option pro Zeile enthalten.
das nächste mal bin ich aber schneller
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Stapel-/Stacküberlauf

Beitrag von 7x7 »

Habe das Option-File angelegt und verlinkt. Das Resultat ist aber immer noch Stack overflow.

2GB Stack - eine Menge Holz...und doch zu wenig?? :(

Kann ich während des Programmablaufs irgendwie den Rest-Stack abfragen?

Edit: ES LÄUFT!!
Waren ja gar keine 2 GB, sondern nur 2MB. Dachte, das sei ein KB-Angabe. Habs jetzt einfach mal auf 1GB erhöht...und siehe da :bounce:

Danke Danilo, hast mich echt vor einem Haufen Arbeit bewahrt!
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Stapel-/Stacküberlauf

Beitrag von Danilo »

7x7 hat geschrieben:2GB Stack - eine Menge Holz...und doch zu wenig?? :(
2GB oder 2MB? (Mein Beispiel war 2MB)

2GB wäre ja die ganze Größe, die ein Programm default (ohne XP 3GB switch)
auf XP 32bit haben kann.
Wie viele rekursive Durchläufe macht Deine Prozedur?
Ab welchem Durchlauf crasht es (mal debuggen/loggen)?
Wie groß sind alle lokalen Variablen und Argumente der Funktion (+4 bytes Rücksprungadresse)?

Kannst Du die Rekursion nicht auflösen?
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Stapel-/Stacküberlauf

Beitrag von NicTheQuick »

Versuch lieber dein rekursives Problem auf ein iteratives Problem zu vereinfachen. Dann musst du dir darüber keine Sorgen mehr machen. Normalerweise versucht man so tiefe Rekursion zu vermeiden. Das macht auch beim Debuggen kein Spaß mehr.
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Stapel-/Stacküberlauf

Beitrag von 7x7 »

Danilo hat geschrieben:2GB oder 2MB? (Mein Beispiel war 2MB)
Ja, habs dann auch gemerkt (siehe /edit in meinem obigen Beitrag)
Danilo hat geschrieben:Wie viele rekursive Durchläufe macht Deine Prozedur?
Keine Ahnung...mit den momentanen Parametern wahrscheinlich einige Milliarden.
Es läuft jetzt seit gut 20 Minuten problemlos. Ein gutes Zeichen! Vorher war nach 1 Sekunde schon der Ofen aus. :D

Nochmal danke!
NicTheQuick hat geschrieben:Versuch lieber dein rekursives Problem auf ein iteratives Problem zu vereinfachen
Habe lange überlegt, wie ich das Problem angehen kann. Rekursion war meiner Meinung nach der effektivste Weg. Und ausserdem: Ich liebe Rekursion :D
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Antworten