SBCL 内存故障错误与零MQ



我是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,没有这样的问题。

最新更新