2017-10-09 4 views
6

Ich weiß, es gibt viele Orte, die ich diese Frage stellen kann, aber ich dachte, ich würde es hier versuchen. Von den guten Menschen bei Maxima habe ich scheinbar schon so viel Hilfe wie möglich bekommen.SBCL Fehler: "Binding Stack erschöpft" beim Ausführen von Maxima auf Linux Maschine

Ich Maxima mit SBCL laufen und konsistent Fehler erhalten;

INFO: Binding stack guard page unprotected 
Binding stack guard page temporarily disabled: proceed with caution 

Maxima encountered a Lisp error: 

Binding stack exhausted. 

PROCEED WITH CAUTION. 

Automatically continuing. 
To enable the Lisp debugger set *debugger-hook* to nil. 
INFO: Binding stack guard page reprotected 

Ich habe durch Hinzufügen größere Werte für die dynamische Bereichsgröße und Steuerstapelgröße, um den Anruf zu Maxima (seine ausführbaren) modifiziert, und ich habe bei ./.../sbcl sah -Help für alle Ideen von Argumenten, um die $ MAXIMA_LISP_OPTIONS in der ausführbaren Maxima hinzuzufügen.

Zusätzlich tue ich normalerweise diese, bevor ich es laufen lasse (obwohl ich vorstelle, dass sie unnötig sind, weil das OS intelligent ist, gut möglicherweise der letzte, mit dem geglänzt werden muss);

sudo fstrim -v/
echo 3 | sudo tee /proc/sys/vm/drop_caches 
echo 262144 | sudo tee /proc/sys/vm/max_map_count 

und nach ein paar Berechnungen während meiner Arbeit Maxima tun, werfe ich in ein paar

:lisp (sb-ext:gc :full t) 

in der Hoffnung, diesen Fehler zu vermeiden. Ich weiß nicht, lisp so gut und sicher nicht alles über Garbage Collection zu verstehen.

Meine Berechnungen sind etwas intensiv und rekursiv, obwohl ich Memoization in der Maxima-Arbeit verwende. Mein Computer wird durch inxi beschrieben -b wie

System: Host: XXX-MacBookPro Kernel: 4.10.0-33-generic x86_64 (64 bit) Desktop: Cinnamon 3.4.6 
      Distro: Linux Mint 18.2 Sonya 
Machine: System: Apple (portable) product: MacBookPro11 3 v: 1.0 
      Mobo: Apple model: Mac-2BD1B313 v: MacBookPro11 3 
      Bios: Apple v: MBP112.88Z.0138.B25.1702171721 date: 02/17/2017 
CPU:  Quad core Intel Core i7-4980HQ (-HT-MCP-) speed/max: 1402/4000 MHz 
Graphics: Card: NVIDIA GK107M [GeForce GT 750M Mac Edition] 
      Display Server: X.Org 1.18.4 drivers: nvidia (unloaded: fbdev,vesa,nouveau) 
      Resolution: [email protected] 
      GLX Renderer: GeForce GT 750M/PCIe/SSE2 GLX Version: 4.5.0 NVIDIA 375.66 
Network: Card-1: Broadcom BCM4360 802.11ac Wireless Network Adapter driver: wl 
      Card-2: Broadcom NetXtreme BCM57762 Gigabit Ethernet PCIe driver: tg3 
Drives: HDD Total Size: 1000.6GB (17.5% used) 
Info:  Processes: 291 Uptime: 43 min Memory: 3366.6/15953.7MB Client: Shell (bash) inxi: 2.2.35 

und meine Maxima und SBCL aus GIT gebaut und sind recht neu ~ ca. 2 Wochen, und von Kopf und haben alle Tests ihr Make geben. Außerdem sieht mein Swap aus;

[email protected] ~/ResearchWC $ cat /proc/swaps 
Filename    Type  Size Used Priority 
/70GiB.swap        file  73400316 0 -2 
/dev/sda7        partition 25564776 0 -1 

und ich bin oft im Grunde nicht genügend Speicher und um 20-30G in Swap.

Normalerweise scheint es schließlich zu hängen (100 Stunden sagen nach, wie ich htop bemerken aufhört, die bestimmte Aktivität und der Lüfter nicht und nach unten geht nach oben) und ich denke, dass die Erschöpfung Fehler manchmal in dem eingebetteten rekursive begraben sind Anrufe. Ich habe diese Fehlermeldung oben erhalten, weil ich vermieden habe, die Funktion auf der Rekursionsebene aufzurufen, die ich möchte, und sie stattdessen "von Hand" am Terminal aufgebaut habe. E.G., statt nur etwas wie fib (10) zu nennen, rief ich stattdessen sukzessive fib (1), fib (2), fib (3) an, wobei jeder vorherige Wert aufgezeichnet wurde.

Ich habe die Zeit, aber scheinbar nicht wissen, wie ich meine Swap maximieren - beobachten htop Ich habe noch nie gesehen es mehr als sagen ~ 25%.

1.) Weiß jemand, was ich sonst mit SBCL tun kann, um diese Fehler zu vermeiden?

2.) Wäre ein anderes Lisp ein besserer in diesen Situationen zu laufen, z.B. ecl, cml usw.?

Vielen Dank im Voraus für jede Beratung, und ich kann mehr Details zur Verfügung stellen, wenn nötig.

UPDATE

Nach der dynamischen Raumgröße Upping, Stackgröße und die Bindungs ​​Stack-Größe, war ich gegen den Haufen Grenze statt Bindungsstapel dieser Zeit, als es abgestürzt ist. Attached ist die Ausgabe von backtrace (Nicht sicher, was die beiden Register pc und fp sind ... - Programmzähler und Rahmenzeiger?). Ich lief dies mit trace (Rückstand, taylor) als gut, aber sah nie etwas fischig ...

ldb> backtrace 
Backtrace: 
    0: SB-BIGNUM::MULTIPLY-BIGNUM-AND-FIXNUM, pc = 0x21cb1336, fp = 0x7ffff3943f18 
    1: SB-KERNEL::TWO-ARG-*, pc = 0x21cb00a7, fp = 0x7ffff3943f98 
    2: MAXIMA::CTIMES, pc = 0x21e076b4, fp = 0x7ffff3943fc0 
    3: MAXIMA::PCTIMES, pc = 0x21de5f4c, fp = 0x7ffff3943ff0 
    4: MAXIMA::PCTIMES1, pc = 0x21e78f1e, fp = 0x7ffff3944048 
    5: MAXIMA::PCTIMES, pc = 0x21de6033, fp = 0x7ffff3944078 
    6: MAXIMA::PCETIMES1, pc = 0x21fe0560, fp = 0x7ffff39440d8 
    7: MAXIMA::PTIMES1, pc = 0x21f457e5, fp = 0x7ffff3944148 
    8: MAXIMA::PTIMES, pc = 0x21db6561, fp = 0x7ffff3944180 
    9: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39441b8 
    10: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39441f0 
    11: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944228 
    12: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944260 
    13: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944298 
    14: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39442d0 
    15: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944308 
    16: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944340 
    17: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944378 
    18: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39443b0 
    19: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39443e8 
    20: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944420 
    21: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944458 
    22: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944490 
    23: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39444c8 
    24: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944500 
    25: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944538 
    26: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944570 
    27: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39445a8 
    28: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39445e0 
    29: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944618 
    30: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944650 
    31: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944688 
    32: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39446c0 
    33: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39446f8 
    34: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944730 
    35: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944768 
    36: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39447a0 
    37: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39447d8 
    38: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944810 
    39: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944848 
    40: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944880 
    41: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39448b8 
    42: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39448f0 
    43: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944928 
    44: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944960 
    45: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944998 
    46: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39449d0 
    47: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944a08 
    48: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944a40 
    49: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944a78 
    50: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944ab0 
    51: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944ae8 
    52: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944b20 
    53: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944b58 
    54: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944b90 
    55: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944bc8 
    56: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944c00 
    57: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944c38 
    58: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944c70 
    59: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944ca8 
    60: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944ce0 
    61: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944d18 
    62: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944d50 
    63: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944d88 
    64: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944dc0 
    65: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944df8 
    66: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944e30 
    67: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944e68 
    68: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944ea0 
    69: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944ed8 
    70: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944f10 
    71: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944f48 
    72: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944f80 
    73: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944fb8 
    74: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944ff0 
    75: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945028 
    76: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945060 
    77: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945098 
    78: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39450d0 
    79: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945108 
    80: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945140 
    81: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945178 
    82: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39451b0 
    83: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39451e8 
    84: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945220 
    85: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945258 
    86: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945290 
    87: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39452c8 
    88: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945300 
    89: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945338 
    90: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945370 
    91: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39453a8 
    92: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39453e0 
    93: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945418 
    94: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945450 
    95: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945488 
    96: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39454c0 
    97: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39454f8 
    98: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945530 
+1

Stack und Heap sind zwei verschiedene Dinge. 'Binding Stack erschöpft' würde in der Regel auf eine hohe Rekursionstiefe hinweisen. Ein großer Heap/Swap würde durch Speicherlecks oder einen GC verursacht, der nicht den gesamten Speicher freigeben kann. Die beste Adresse ist die SBCL-Mailingliste. Eine alternative Implementierung wäre Clozure CL. –

+0

@RainerJoswig Gibt es eine Möglichkeit, die maximale Call-Stack-Tiefe in Common Lisp zu bestimmen? oder wenn nicht dann speziell für SBCL? Ich erinnere mich, dass es eine Konstante gibt, die die maximale Stapeltiefe angibt, aber eine Websuche scheint so etwas nicht zu finden. Vielleicht ist es ein bisschen Wunschdenken meinerseits. –

+0

Der einzige Ort, an dem ich die "maximale Call - Stack - Tiefe" erwähne, ist die Verwendung in Profiling, Abschnitt 15.2.4 und 15.2.5 unter http://sbcl.org/manual/index.html und eine Beschreibung der Bindung und Entbindung in das interne Handbuch in Abschnitt 8.2 unter http://sbcl.org/sbcl-internals/Binding-and-unbinding.html#Binding-and-unbinding. Schnelle zwei Frage (vielleicht was @RobertDodier @RainerJoswig) ist die Tiefe des Bindungsstapels, die durch eine veränderbare Variable gesteuert wird, und hat "Kontrollstapelgröße" irgendeinen Einfluss darauf? Ich habe eine #define in validate.h Einstellung BINDING_STACK_SIZE auf 1024 * 1024 sehen ... Kann ich es erhöhen? – nate

Antwort

4

Die häufigste Ursache von bind Stack-Überlauf ist eine rekursive Funktion, die sich auf unbestimmte Zeit nimmt (dh ein Fehler in der Rekursion). Die zweithäufigste Ursache ist eine rekursive Funktion, die korrekt programmiert ist, aber sich selbst zu oft aufruft, um von der Lisp-Implementierung behandelt zu werden.

Ich vergesse, was das Stack-Limit für SBCL ist - es könnte 8192 sein, aber das ist nur eine Vermutung. Sie könnten es wahrscheinlich durch Experiment bestimmen (wenn nicht durch das Lesen der SBCL-Dokumentation). über

trace (mymaximafun1, mymaximafun2, ...); 

für Maxima Funktionen und/oder

:lisp (trace mylispfun1 mylispfun2 ...) 

für Lisp Funktionen

In jedem Fall, dass Sie verursachen Probleme, welche Funktion oder Funktionen, um herauszufinden versuchen.

Über das zweite Problem können Sie versuchen, tiefe Rekursionen zu vermeiden, indem rekursive Funktionen als Iterationen überarbeitet werden.

Sie erwähnten, dass Sie lange laufende Berechnungen haben. Eine Strategie, die Wirkung der Abstürze zu verringern ist die save Funktion aufzurufen jeder jetzt den Programmstatus zu speichern und dann, zum Beispiel:

save ("mycheckpointfile.lisp", all); 

Beachten Sie, dass save viele Möglichkeiten nimmt, so nehmen Sie vielleicht einen Blick auf die Dokumentation über ? save.

Sie können Dateinamen automatisch über ein Rezept wie file_name : printf(false, "mycheckpointfile~d.lisp", 1000 + random(9000)) generieren, das eine zufällige 4-stellige Zahl generiert und in den Dateinamen einfügt. Natürlich gibt es viele solche Rezepte.

+0

Danke, Ihr Trace-Vorschlag hat nicht zu offensichtlichen Fehlern geführt, aber immer noch auf der Suche ... – nate

+1

Sie können möglicherweise eine Stack-Trace abrufen - wenn das Programm zu einem SBCL Debugger Prompt geht, versuchen Sie ': backtrace'. Ich weiß nicht, ob das funktioniert. –

Verwandte Themen