2012-03-09 146 views
0

我有一个运行在.NET Framework 4.0 x64上的x64 C#应用程序,它使用的clrzmq -x64 2.2.2(来自NuGet)。在libzmq.dll中导致此崩溃的原因是什么?

当我调试它时它工作正常(即F5),但它每秒只发送大约30条消息。如果我没有附加调试器(即CTRL-F5),它每秒钟处理超过1000条消息......但在大约30秒后崩溃。

我在诊断问题时遇到了问题,因为它崩溃的地方不在我的代码中。

我粘贴了所有可能有用的信息,但我很努力地知道如何解释堆栈跟踪。

事件日志:

Faulting application name: MyApplication.exe, version: 1.0.0.0, time stamp: 0x4f5a05b3 
Faulting module name: MSVCR100.dll, version: 10.0.40219.325, time stamp: 0x4df2bcac 
Exception code: 0x40000015 
Fault offset: 0x00000000000761c9 
Faulting process id: 0x273c 
Faulting application start time: 0x01ccfdf8acdc087e 
Faulting application path: [path redacted]\MyApplication.exe 
Faulting module path: C:\Windows\system32\MSVCR100.dll 
Report Id: f3518caf-69eb-11e1-9ed1-50e549e1c0d9 

堆栈跟踪:

msvcr100.dll!__crt_debugger_hook() 
msvcr100.dll!_call_reportfault() + 0x124 bytes 
msvcr100.dll!abort() + 0x35 bytes 
libzmq.dll!zmq::signaler_t::make_fdpair(unsigned __int64 * r_=0x000000002c557ee0, unsigned __int64 * w_=0x000007feedcb7ad2) Line 263 C++ 
libzmq.dll!zmq::signaler_t::signaler_t() Line 80 C++ 
libzmq.dll!zmq::mailbox_t::mailbox_t() Line 26 + 0x17 bytes C++ 
libzmq.dll!zmq::socket_base_t::socket_base_t(zmq::ctx_t * parent_=0x0000000027e3e470, unsigned int tid_=4294967294) Line 124 + 0x6b bytes C++ 
libzmq.dll!zmq::push_t::push_t(zmq::ctx_t * parent_=0x0000000076e3e3db, unsigned int tid_=0) Line 30 + 0xe bytes C++ 
libzmq.dll!zmq::socket_base_t::create(int type_=43532552, zmq::ctx_t * parent_=0x0000000002984130, unsigned int tid_=43532512) Line 100 + 0x29 bytes C++ 
libzmq.dll!zmq::ctx_t::create_socket(int type_=489832384) Line 184 + 0xe bytes C++ 
clr.dll!DoNDirectCall__PatchGetThreadCall() + 0x7b bytes 
000007ff00168461() 
000007ff0016833f() 
000007ff00166b22() 
000007ff00166997() 
mscorlib.ni.dll!000007fef4669e70() 
[Frames below may be incorrect and/or missing, no symbols loaded for mscorlib.ni.dll] 
00000000030bd4c0() 
0000000027e3e9c8() 
mscorlib.ni.dll!000007fef4094568() 
clr.dll!JIT_IsInstanceOfAny() + 0x20 bytes 
mscorlib.ni.dll!000007fef465e56b() 
00000000030bd560() 
00000000006f8d10() 

回答

1

这是https://github.com/zeromq/libzmq/pull/491

基本上,在繁忙的Windows系统中,许多ZMQ套接字经常被创建和销毁,创建一个套接字意味着创建一对内部套接字,并且这可能会失败,并显示上面显示的相同堆栈。更糟糕的是,在非调试版本上,异常会导致套接字创建代码放弃一个关键部分,这会导致随后创建套接字的尝试永远挂起。

上面的链接有一个修复程序,我们正在测试,因为我输入这个。

+0

修复程序按预期工作。我们在创建套接字时看不到这些失败,也看不到create_socket在之后永远挂起。 – 2013-04-08 19:56:13

1

是否有可能要创建新的套接字所有的时间?在这种情况下,尝试设置上下文和套接字一次并重新使用它们。

+0

我正在使用共享的上下文,但在不同的任务中创建多个套接字。如果我共享套接字,那么带有帧消息的REQ/REP不起作用,因为一个Task可能试图在该套接字上发送()或SendMore(),而另一个正在调用Recv()。我想我需要一种将套接字限制在一个池中的方法,所以我不会达到这个限制。 – tjrobinson 2012-03-10 08:33:05

相关问题