2013-02-02 9 views
1

tcpip에 대한 비동기 I/O에 대한 부스트 테스트를 설정하려고합니다.부스트 테스트 및 async IO : 메모리 액세스 위반 주소 : 주소 매핑 오류 없음

내 부스트 테스트 기능의 모습 (부스트 테스트를하고 실행하지 않음) 난 그냥 메인 스레드에서 실행하는 경우

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); 
     } 

    } 

이제이 기능이 잘 작동 :

내 기능은 TCP의 MSG를 보내 이 :

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); 
} 

그것은 다음과 같은 오류와 함께 실패합니다

비동기 함수를 테스트하는 동안주의해야 할 사항이 있습니까?

내 빌드 정보는 다음과 같습니다

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; 
    } 

} 
+0

'CommunicationCoreFixture'의 기본 생성자가'c' 회원이 유효한 객체를 가리키는 지 확인합니까? –

+0

예. 사실 내가 부품을 제거하면 언급해야합니다 : m_Socket.async_send (boost :: asio :: buffer (buffer, length), boost :: bind (& fingigcc :: TcpClient :: sendMsgToServerErrorHandler, this, boost :: asio :: placeholders :: error, boost :: asio :: placeholders :: bytes_transferred)); 문제없이 실행됩니다. –

답변

3

m_Socket.async_send(boost::asio::buffer(buffer, length) -하지만 msg 개체는 로컬이며 그 개체는 c_str()입니다.이 범위를 벗어나면 ult가 무효화됩니다! 따라서 실제로는 임시 버퍼을 비동기 작업에 전달합니다. 버퍼는이 작업보다 오래 지속되지 않으므로 segfault는 필연적입니다.

+0

귀하의 제안에 그것을 편집했습니다. 내가 옳았는지 확실하지 않습니다. 하지만 여전히 동일한 오류가 발생했습니다 –

+0

@Shrouk Hasan Khan 그것은 이제 올바르게 보입니다. 그래도 충돌이 발생하면 다른 장소 (비슷한 장소)에서 발생한 것일 수 있습니다. 게다가'TcpClient' 인스턴스가 비동기 작업보다 오래 지속되는지 확인하십시오. –

+1

당신은 정확합니다. 오류는 boost :: thread를 sendMsgToServer에 전달할만큼 충분히 길지 않은 함수 (여기서는 언급하지 않음)에서 초기화 할 때 발생합니다. –