gpt4 book ai didi

c++ - 多次使用 boost 序列化时崩溃

转载 作者:搜寻专家 更新时间:2023-10-31 02:17:59 24 4
gpt4 key购买 nike

我正在制作一个序列化数据结构并将其发送到服务器的程序。当序列化函数在使用时失败,或多或少 40 次左右,就会出现问题。

我正在使用 Visual Studio Community 2015boost 1.59 32bitswinsock2,程序是用 32 位架构编译的。

错误是:

Exception produced in 0x772BE3C6 (ntdll.dll) in Test.exe: 0xC0000005: Access violation reading the location 0x3838E1A9.

下面是一个使用崩溃函数的简单示例:

#define WIN32_LEAN_AND_MEAN

#include <WinSock2.h>
#include <WS2tcpip.h>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/iostreams/device/back_inserter.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/iostreams/stream.hpp>

struct StructFunction
{
char function;
int arguments;

template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & function;
ar & arguments;
}
};
BOOST_CLASS_IMPLEMENTATION(StructFunction, boost::serialization::object_serializable)

bool Send(std::string buffer)
{
int iResult = send(ConnectSocket, buffer.data(), buffer.size(), 0);

if(iResult == SOCKET_ERROR)
{
printf("send failed: %d\n", WSAGetLastError());
Stop();
return false;
}

return true;
}

int SerializeAndSend(StructFunction structFunction)
{
// serialize obj into an std::string
std::string serial_str;
serial_str.clear();

boost::iostreams::back_insert_device<std::string> inserter(serial_str);
boost::iostreams::stream<boost::iostreams::back_insert_device<std::string> >
s(inserter);
boost::archive::binary_oarchive oa(s); // This throws the error

oa << structFunction;

// flush the stream to finish writing into the buffer
s.flush();

Send(serial_str);

return 1;
}

int main(int argc, char* argv[])
{
ConnectSocket = /* We create a socket that is connected to the server using winsock2 */

StructFunction structFunction;
structFunction.function = "A";
structFunction.parameter = 1;

SerializeAndSend(structFunction);
}

在实际代码中,函数 SerializeAndSend 大约被调用了 40 次。

我可以肯定地说,90% 的序列化结构已初始化并且没有任何错误值。

我尝试清理客户端和服务器中的项目。他们使用的 RAM 非常低,大约 13mb。

不知道为什么用了就失败了,不是第一次用

最佳答案

消除原因的想法,就是让事情变得非常独立,只观察它是否仍然重现/一个问题:

Live On Coliru

#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/iostreams/device/back_inserter.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/iostreams/stream.hpp>

struct StructFunction
{
char function;
int arguments;

template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & function;
ar & arguments;
}
};

BOOST_CLASS_IMPLEMENTATION(StructFunction, boost::serialization::object_serializable)

bool Send(std::string buffer)
{
/*
* int iResult = send(ConnectSocket, buffer.data(), buffer.size(), 0);
*
* if(iResult == SOCKET_ERROR)
* {
* printf("send failed: %d\n", WSAGetLastError());
* Stop();
* return false;
* }
*/

return true;
}

int SerializeAndSend(StructFunction structFunction)
{
// serialize obj into an std::string
std::string serial_str;

namespace bio = boost::iostreams;

{
bio::stream<bio::back_insert_device<std::string> > s(serial_str);
boost::archive::binary_oarchive oa(s);
oa << structFunction;
}

static bool do_init = true;
if (do_init) {
std::cout << "DEBUG: \n";
for (uint8_t ch : serial_str)
std::cout << std::setw(2) << std::setfill('0') << std::showbase << std::hex << static_cast<int>(ch) << " ";
do_init = false;
}

Send(serial_str);

return 1;
}

int main()
{
//ConnectSocket = [> We create a socket that is connected to the server using winsock2 <]

for (auto i = 0ull; i< 1ull << 22; ++i) {
StructFunction structFunction;
structFunction.function = 'A';
structFunction.arguments = 1;

SerializeAndSend(structFunction);
}
}

如你所见,不费吹灰之力,输出:

DEBUG: 
0x16 00 00 00 00 00 00 00 0x73 0x65 0x72 0x69 0x61 0x6c 0x69 0x7a 0x61 0x74 0x69 0x6f 0x6e 0x3a 0x3a 0x61 0x72 0x63 0x68 0x69 0x76 0x65 0xd 00 0x4 0x8 0x4 0x8 0x1 00 00 00 0x41 0x1 00 00 00
real 0m24.026s
user 0m24.010s
sys 0m0.000s

下一步是什么?

您的 系统上试试。如果没问题,那么问题出在Send(和相关函数)。

如果您在平台上发现问题,请考虑(内存)分析并启用调试堆进行诊断。

关于c++ - 多次使用 boost 序列化时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35037289/

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