c++ - 提升测试和异步 IO : memory access violation at address : no mapping at fault address

标签 c++ linux boost-asio boost-test

我正在尝试为 tcpip 的异步 I/O 设置升压测试。

我发送 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

编辑:

我也试过按以下方式修改它..但仍然出现相同的错误:

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() 结果在 msg 超出范围后变得无效!所以你实际上将一个 临时缓冲区 传递给异步操作。缓冲区不会超过此操作,所以段错误是不可避免的。

关于c++ - 提升测试和异步 IO : memory access violation at address : no mapping at fault address,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14662956/

相关文章:

c++ - 将 boost::asio::post 用于接受参数的函数

c++ - 如何迭代 unordered_set 中的无序对?

android - 如何将代码从 QSerialPort 迁移到 QBluetoothSocket

python fabric 如何在远程机器上启动进程

linux - 如何使用 "getopts"选项下的 2 个参数调用函数

c++ - boost::async_write 在写入一段时间后失败

c++ - 处理一个套接字和多个线程时异步 IO 的用例

c++ - 将字节数组转换为编码字符串

c++ - 简单数组坐标显示匹配

c - 使用 setsockopt;当套接字从另一端关闭时,read 返回 0 而不是 -1