- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如果在 .dll
中使用此代码, 对 socket.recv()
的调用会引发一个异常 STACK_OVERFLOW
,但是当此代码编译为 .exe
时,它可以正常工作。
为什么?
我通过“C:\windows\system32\rundll32.exe myDll.dll StartUp
”运行.dll
测试
void StartUp()
{
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("tcp://127.0.0.1:3456");
zmq::message_t msgIN, msgOUT("test", 4);
while (true){
socket.recv(&msgIN);
socket.send(msgOUT);
};
}
调用堆栈:
libzmq-v120-mt-gd-4_2_2.dll!zmq::mailbox_t::recv(zmq::command_t * cmd_=0x0231f700, int timeout_=0x00000000)
libzmq-v120-mt-gd-4_2_2.dll!zmq::io_thread_t::in_event()
libzmq-v120-mt-gd-4_2_2.dll!zmq::select_t::loop()
libzmq-v120-mt-gd-4_2_2.dll!zmq::select_t::worker_routine(void * arg_=0x002f1778)
libzmq-v120-mt-gd-4_2_2.dll!thread_routine(void * arg_=0x002f17c0)
主线程调用栈:
libzmq-v120-mt-gd-4_2_2.dll!zmq::signaler_t::wait(int timeout_=0xffffffff)
libzmq-v120-mt-gd-4_2_2.dll!zmq::mailbox_t::recv(zmq::command_t * cmd_=0x0019f3c0, int timeout_=0xffffffff)
libzmq-v120-mt-gd-4_2_2.dll!zmq::socket_base_t::process_commands(int timeout_, bool throttle_)
libzmq-v120-mt-gd-4_2_2.dll!zmq::socket_base_t::recv(zmq::msg_t * msg_=0x0019f628, int flags_=0x00000000)
libzmq-v120-mt-gd-4_2_2.dll!s_recvmsg(zmq::socket_base_t * s_=0x006f6c70, zmq_msg_t * msg_=0x0019f628, int flags_=0x00000000)
libzmq-v120-mt-gd-4_2_2.dll!zmq_msg_recv(zmq_msg_t * msg_=0x0019f628, void * s_=0x006f6c70, int flags_=0x00000000)
mydll.dll!zmq::socket_t::recv(zmq::message_t * msg_=0x0019f628, int flags_=0x00000000)
mydll.dll!StartUp()
这个例子,同样的原因也崩溃了。有人知道异常堆栈溢出的任何原因吗?
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("tcp://*:7712");
while (1){
Sleep(10);
}
这个myDll.dll
-test是如何工作的,
如果通过 C:\windows\system32\rundll32.exe myDll.dll StartUp
运行?发布屏幕输出。
void StartUp()
{
std::cout << "INF:: ENTRY POINT ( C:\windows\system32\rundll32.exe myDll.dll StartUp )" << std::endl;
std::cout << "INF:: WILL SLEEP ( C:\windows\system32\rundll32.exe myDll.dll StartUp )" << std::endl;
Sleep( 10 );
std::cout << "INF:: SLEPT WELL ( C:\windows\system32\rundll32.exe myDll.dll StartUp )" << std::endl;
std::cout << "INF:: WILL RETURN ( C:\windows\system32\rundll32.exe myDll.dll StartUp )" << std::endl;
}
最佳答案
崩溃的原因是 OPTIONAL_HEADER rundll32 文件中的 SizeOfStackCommit 值。它太小了(0xC000),我把它改成 0x100000。现在一切正常。
关于c++ - ZeroMQ socket.recv() 引发了 STACK_OVERFLOW 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47578683/
我的快速排序代码适用于 N(列表大小)的某些值,但对于大值(例如,N = 82031),OCaml 返回的错误是: Fatal error: exception Stack_overflow. 我做错
所以我刚刚来到书中解释堆栈的部分。以下是它们在我的书中的定义方式(代码): #include #define STACK_SIZE 100 int contents[STAC_SIZE] int t
我想问下exception :"exception Stack_overflow"是否会导致死循环,特别是异常出现在下面的代码中: ( *the loop "while" should sto
如果在 .dll 中使用此代码, 对 socket.recv() 的调用会引发一个异常 STACK_OVERFLOW,但是当此代码编译为 .exe 时,它可以正常工作。 为什么? 我通过“C:\win
我是一名优秀的程序员,十分优秀!