Ich bin neu in Lisp und versuche, mit ZMQ darin zu arbeiten. Für eine einfache Funktion erhalte ich den Fehler unten. Wie debugge ich diesen Fehler? Gibt es Hilfsmittel, um zu helfen? Es fällt mir nicht in den ldb, wie sehe ich was an der Adresse mit dem Fehler gedruckt wird?sbcl Speicherfehler-Fehler mit zeromq
Unhandled memory fault at #x10CC8B000.
[Condition of type SB-SYS:MEMORY-FAULT-ERROR]
Restarts:
0: [RETRY] Retry SLIME REPL evaluation request.
1: [*ABORT] Return to SLIME's top level.
2: [ABORT] abort thread (#<THREAD "new-repl-thread" RUNNING {1003E0F353}>)
Backtrace:
0: (SB-SYS:MEMORY-FAULT-ERROR)
[No Locals]
1: ("foreign function: call_into_lisp")
[No Locals]
2: ("foreign function: post_signal_tramp")
[No Locals]
3: ("foreign function: _ZN3zmq6pipe_t12get_identityEv")
[No Locals]
4: ("foreign function: _ZN3zmq8router_t5xrecvEPNS_5msg_tE")
[No Locals]
5: ("foreign function: _ZN3zmq5rep_t5xrecvEPNS_5msg_tE")
[No Locals]
6: ("foreign function: _ZN3zmq13socket_base_t4recvEPNS_5msg_tEi")
[No Locals]
7: ("foreign function: _ZL9s_recvmsgPN3zmq13socket_base_tEP9zmq_msg_ti")
[No Locals]
8: (ZEROMQ::%MSG-RECV #.(SB-SYS:INT-SAP #X005002D0) #.(SB-SYS:INT-SAP #X06006000) 0)
Locals:
SB-DEBUG::ARG-0 = #.(SB-SYS:INT-SAP #X005002D0)
SB-DEBUG::ARG-1 = #.(SB-SYS:INT-SAP #X06006000)
SB-DEBUG::ARG-2 = 0
9: ((LAMBDA (&REST SB-DI::ARGS) :IN SB-DI::HANDLE-SINGLE-STEP-AROUND-TRAP) #.(SB-SYS:INT-SAP #X06006000) #S(ZEROMQ:MSG :RAW #.(SB-SYS:INT-SAP #X005002D0)))
Locals:
SB-DI::ARGS = (#.(SB-SYS:INT-SAP #X06006000) #S(ZEROMQ:MSG :RAW #.(SB-SYS:INT-SAP #X005002D0)))
10: (RECV)
Locals:
CONTEXT = #.(SB-SYS:INT-SAP #X00500CC0)
SOCKET = #.(SB-SYS:INT-SAP #X06006000)
11: (SB-INT:SIMPLE-EVAL-IN-LEXENV (RECV) #<NULL-LEXENV>)
Locals:
SB-DEBUG::ARG-0 = (RECV)
SB-DEBUG::ARG-1 = #<NULL-LEXENV>
12: (EVAL (RECV))
Locals:
SB-DEBUG::ARG-0 = (RECV)
--more--
Hier ist der Code, den ich versuche zu laufen. Ich bin diese beiden Funktionen in zwei verschiedenen sbcl laufenden Prozesse
sbcl < 1>
(defun send()
(zmq:with-context (context)
(zmq:with-socket (socket context :req)
(break)
(zmq:connect socket "tcp://127.0.0.1:3333")
(break)
(zmq:msg-send socket (zmq:make-msg :size 6 :data "Jello")))))
(send)
sbcl < 2>
(defun recv()
(zmq:with-context (context)
(zmq:with-socket (socket context :rep)
(break)
(zmq:bind socket "tcp://127.0.0.1:3333")
(break)
(zmq:msg-recv
socket (zmq:make-msg :size 6)))))
(recv)
[EDIT]
Nach etwas herumgegraben, fand ich diese Nachricht im Puffer
* sbcl(49664,0x700000104000) malloc: *** error for object 0x500058: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
CORRUPTION WARNING in SBCL pid 49664(tid 123145303375872):
Received signal 6 in non-lisp thread 123145303375872, resignalling to a lisp thread.
The integrity of this image is possibly compromised.
Continuing with fingers crossed.
Ich habe das gleiche C-Bibliothek verwendet damit Python ist & Knoten Bindungen und es funktioniert ohne Fehler in Python und Knoten. Ich renne nur in diese Fehler mit CL
Diese Art von Fehlern tritt auf, wenn Sie mit C-Code mit Fremdfunktionsschnittstelle (CFFI) kommunizieren. Grundsätzlich wird ein C-Zeiger schlecht verwendet. Es scheint Probleme mit 'ZEROMQ ::% MSG-RECV 'zu geben, aber wir wissen nicht, was Sie versucht haben. Können Sie den Code, der den Fehler auslöst, veröffentlichen, damit wir versuchen können, ihn zu replizieren? – coredump
Ja, ich bin CFFI, oder eher die Bibliothek ist. Ich habe den Code eingefügt, den ich ausführen möchte. Der Speicherfehler tritt nicht jedes Mal auf. Manchmal scheint es richtig funktioniert zu haben, und manchmal stürzt sbcl einfach ab und ich bekomme die folgende Meldung 'Lisp Verbindung wurde unerwartet geschlossen: Verbindung durch entfernten Peer unterbrochen ' – saq7
Sind die Nachrichten wirklich größer (6) als ihre Daten (5) – tfb