gpt4 book ai didi

c++ - ZeroMQ socket.recv() 引发了 STACK_OVERFLOW 异常

转载 作者:太空宇宙 更新时间:2023-11-04 14:29:26 25 4
gpt4 key购买 nike

如果在 .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);
}

反向问题隔离 MCVE:

这个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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com