带有 zeromq 的 sbcl 内存故障错误

sbcl memory-fault-error with zeromq

我是 Lisp 的新手,正在尝试在其中使用 ZMQ。对于一个简单的函数,我得到以下错误。 如何调试此错误?有什么工具可以帮忙吗?它没有让我进入 ldb,我如何查看打印有错误的地址中的内容?

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--

这是我正在尝试的代码 运行。我运行在两个不同的 sbcl 进程中使用这两个函数

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)

[编辑]

经过一番挖掘,我在缓冲区中找到了这条消息

* 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.

我使用了相同的 C 库及其 Python 和 Node 绑定,它在 Python 和 Node 中正常工作。我只是 运行使用 CL

解决了这些错误

所以在#zeromq IRC 闲逛几天后,使用 lldb 调试内存问题,我终于放弃了。 zeromq 的 CL 绑定未在 OS X 上测试,它们不起作用。

我换成Ubuntu,就没有这样的问题。