升压测试和异步IO:在地址的内存访问冲突:在故障地址没有映射
我正在尝试为tcpip设置异步I/O的升压测试。升压测试和异步IO:在地址的内存访问冲突:在故障地址没有映射
我的函数来发送TCP消息:
int TcpClient::sendMsgToServer(string msg) {
if (isConnected == true) {
Logger::debug("Asynch send request for msg: " + msg, __LINE__,
__FILE__);
sendSequence++;
msg.append("\r\n");
int length = msg.length() + 2; //+2 is for \r\n
char* buffer = (char*) msg.c_str();
Logger::debug(buffer, __LINE__, __FILE__);
m_Socket.async_send(boost::asio::buffer(buffer, length),
boost::bind(&fingigcc::TcpClient::sendMsgToServerErrorHandler,
this, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
std::string sentMsg = "Sent Msg: " + msg;
Logger::debug(sentMsg, __LINE__, __FILE__);
return 0;
} else {
return -1;
}
}
void TcpClient::sendMsgToServerErrorHandler(
const boost::system::error_code& error, std::size_t bytes_transferred) {
Logger::debug("Sending complete: ", __LINE__, __FILE__);
sendResponseSequence++;
int i = error.value();
std::stringstream ss;
ss.clear();
ss << i;
Logger::debug("RESULTCODE: " + ss.str(), __LINE__, __FILE__);
if (i == 0) {
Logger::debug("RESULT: " + error.message(), __LINE__, __FILE__);
} else {
Logger::crit(error.message(), __LINE__, __FILE__);
m_Socket.close();
isConnected = false;
connectionStateChanged(isConnected);
}
}
现在此功能工作正常,如果我只是在主线程中运行(不运行做升压试验)
我升压测试功能看起来像这样的:
BOOST_AUTO_TEST_CASE(CommunicationCore_sendTcpIpMsg_test) {
CommunicationCoreFixture f;
int compare = f.c->initializeTcpIpConnection(serverAddress, serverPort); // i initialize the connection here. runs fine with any issue
sleep(2);
compare = f.c->sendMsgToServer("IDENTIFY console-2");
BOOST_MESSAGE("Sending returned value : " << compare);
BOOST_CHECK(compare == 0);
}
和失败,出现以下错误:
Entering test case "CommunicationCore_sendTcpIpMsg_test"
unknown location(0): fatal error in "CommunicationCore_sendTcpIpMsg_test": memory access violation at address: 0x01003255: no mapping at fault address
*****************Test is aborted
有什么我应该知道,而测试这样的异步功能?
我的生成信息:
Platform: linux
Compiler: GNU C++ version 4.7.2
STL : GNU libstdc++ version 20120920
Boost : 1.49.0
编辑:
我曾尝试通过以下方式修改它well..but仍然得到同样的错误:
int TcpClient::sendMsgToServer(string msg) {
if (isConnected == true) {
Logger::debug("Asynch send request for msg: " + msg, __LINE__,
__FILE__);
sendSequence++;
msg.append("\r\n");
char *buffer = new char[msg.size() + 1];
buffer[msg.size()] = 0;
memcpy(buffer, msg.c_str(), msg.size());
Logger::debug(buffer, __LINE__, __FILE__);
m_Socket.async_send(boost::asio::buffer(buffer, (msg.size() + 1)),
boost::bind(&fingigcc::TcpClient::sendMsgToServerErrorHandler,
this, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
std::string sentMsg = "Sent Msg: " + msg;
Logger::debug(sentMsg, __LINE__, __FILE__);
return 0;
} else {
return -1;
}
}
m_Socket.async_send(boost::asio::buffer(buffer, length)
- 但是msg
对象是本地的,它的c_str()
res在msg
超出范围后,ult将无效!所以你实际上将一个临时缓冲区传递给一个异步操作。缓冲区不会超过这个操作,所以segfault是不可避免的。
编辑您的建议..不确定我做对了。但仍然得到相同的错误 –
@Shrouk哈桑汗现在看起来是正确的。如果你仍然崩溃,也许它来自另一个(但相似)的地方。此外,请检查“TcpClient”实例是否超出了异步操作。 –
事实上,你是正确的。该错误来自于初始化函数中的boost :: thread(这里没有提到),该函数没有足够长的时间传递给sendMsgToServer。 –
'CommunicationCoreFixture'的默认构造函数是否确保其'c'成员指向一个有效的对象? –
是的。事实上,我应该提到,如果我删除零件: m_Socket.async_send(boost :: asio :: buffer(buffer,length), boost :: bind(&fingigcc :: TcpClient :: sendMsgToServerErrorHandler, this,boost :: asio :: placeholders :: error, boost :: asio :: placeholders :: bytes_transferred));它运行没有问题。 –