Debugging 零MQ的sbcl内存故障错误

Debugging 零MQ的sbcl内存故障错误,debugging,lisp,common-lisp,sbcl,Debugging,Lisp,Common Lisp,Sbcl,我是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

我是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(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.

我在Python和Node绑定中使用了相同的C库,并且在Python和Node中没有错误。我只是在CL中遇到了这些错误,所以在#zeromq IRC中呆了几天,用lldb调试内存问题后,我终于放弃了。zeromq的CL绑定没有在OS X上测试,并且不起作用


我切换到Ubuntu,没有这样的问题

当您使用带有外部函数接口(CFFI)的C代码进行接口时,会出现此类错误。基本上,一些C指针使用得不好。
ZEROMQ::%MSG-RECV
似乎有一些问题,但我们不知道您试图做什么。你能发布触发错误的代码,以便我们可以尝试复制它吗?是的,我是CFFI,或者更确切地说是库。我粘贴了我试图运行的代码。内存错误并非每次都出现。有时,它似乎工作正常,而另一些时候sbcl崩溃了,我收到以下消息
Lisp连接意外关闭:远程对等方断开的连接
消息是否真的要比它们的数据(5)大(6)?没有,但我试着将其保持在6,看看是否有帮助。没有。经过更多的调试,我发现malloc发送了一个SIGABRT,导致lisp连接终止。底层C库是libzmq@saq7您是否尝试过不指定大小并让实现推断它,因为您看到的几乎肯定是C级别的内存错误。
(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.