Debugging 零MQ的sbcl内存故障错误
我是Lisp新手,正在尝试使用ZMQ。对于一个简单的函数,我得到下面的错误如何调试此错误?有什么工具可以帮助你吗?它并没有把我丢进ldb,我如何看到打印有错误的地址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
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.