2011-12-14 2 views
0

그래서 모든 종류의 로깅을위한 로깅 라이브러리를 작성 중이며 테스트를 실행했을 때 충돌이 계속 발생했습니다. ofstream 파일에 로그 메시지를 쓸 때 예외를 쓰기 기능으로 축소했습니다. 메시지와 내용을 파싱 한 다음 ofstream :: write()에 대한 실제 호출이 있습니다. 당신이 볼 수 있듯이, 나는 시도의 catch 블록에서 전화를 가지고 파일이 유효하고 열려있는 경우 심지어 확인ofstream :: write() 처리되지 않은 예외

void Logger::writeMessage(LogMessage* message) 
{ 
    if(message==NULL) 
     return; 
    char buffer[MAX_PATH]; 
    switch(message->GetMessageType()) 
    { 
    case LOGMESSAGE_HEADER: 
     sprintf(buffer, m_logInfo->headerFormat, message->GetMessage().c_str()); 
     break; 
    case LOGMESSAGE_FOOTER: 
     sprintf(buffer, m_logInfo->footerFormat, message->GetMessage().c_str()); 
     break; 
    case LOGMESSAGE_DEBUG: 
     sprintf(buffer, "%s %s", m_logInfo->debugPrefix.c_str(), message->GetMessage().c_str()); 
     break; 
    case LOGMESSAGE_ADDRESS: 
     sprintf(buffer, "%s %s", m_logInfo->addressPrefix.c_str(), message->GetMessage().c_str()); 
     break; 
    case LOGMESSAGE_VALUE: 
     sprintf(buffer, "%s %s", m_logInfo->valuePrefix.c_str(), message->GetMessage().c_str()); 
     break; 
    case LOGMESSAGE_CUSTOM: 
    default: 
     sprintf(buffer, "test!", message->GetMessage().c_str()); 
     break; 
    } 
    try 
    { 
     if(!m_ofile.is_open() || !m_ofile.good()) 
      return; 

     //string formattedMessage(buffer); 
     //formattedMessage.append(m_logInfo->lineTerminator); 

     string result; 
     if(message->IsUsingTimestamp()) 
     { 
      m_ofile << message->GetTimeStamp().GetTimeString().c_str() << " "; 
      //result.append(message->GetTimeStamp().GetTimeString()); 
      //result.append(" "); 
     } 

     m_ofile << buffer << m_logInfo->lineTerminator; 

     //result.append(formattedMessage); 
     //result.push_back('\0'); 

     //m_ofile.write(result.c_str(), MAX_PATH); 
     //m_ofile << result.c_str(); 
    } 
    catch(std::exception &e) 
    { 
     MessageBox(NULL, e.what(), "ERROR", NULL); 
    } 
} 

: 여기 내가 reuntime 오류가 발생하는 부분입니다. 내가 전화하고 주위의 모든에 중단 점을 설정하면, 통화가 잘 작동하지만, 함수의 끝에 도달 일단이 저를 제공합니다

Unhandled exception at 0x773515ee in LoggerTest.exe: 0xC0000005: Access violation writing location 0xfeeefeee.

을 한 후 내부에이 기능에서 발생하는 오류를 보여줍니다 xlock.cpp :

__thiscall _Lockit::_Lockit(int kind) 
    : _Locktype(kind) 
    { // lock the mutex 
    if (_Locktype < MAX_LOCK) 
     _Mtxlock(&mtx[_Locktype]); 
    } 

내 생각 엔 내가 나쁜 문자열이 있거나 어딘가 포인터이다,하지만 난 그것을 찾아 낼 수 없습니다.

참고 : 나는

m_ofile << "test!"; 

을하고 시도하고 지금은 내가 여기에 실패 주장 제공 : _ASSERTE(_CrtIsValidHeapPointer(pUserData));

+0

여러 스레드에서 스트림에 액세스하고 있습니까? – bames53

+1

FWIW,'0xfeeefeee'는 MSVC 디버그 모드의 힙 할당 메모리입니다. – Cubbi

+0

코드 제거를 시작하고 문제가 언제 사라지는 지 확인하십시오. – Mankarse

답변

0

.c_str() 함수는 ostream에 출력 문제가 발생할 수있는 포인터를 반환합니다.

이 블록 밖으로 변환해야하는 이유가없는 한, < < 결과를 C 문자열로 바꾸지 않고 문제가 해결되는지 확인하십시오.

+0

ofstream 객체는 std :: string 유형을 지원하지 않으므로, 알고있는 한 문자열 클래스 내부의 변환이 필요합니다. – Zayats

+1

@Zayats ofstream 객체는'std :: string's의 출력을 지원합니다. '#include '을 잊어 버리셨습니까? – Cubbi

+0

그들은 무엇을합니까? 그게 새거야. 나는 을 포함했다. C++ 문자열이나 C 문자열을 전달하면 동일한 오류가 발생하므로 실제로 문제가되지 않습니다. 아직도 미래의 참조를 위해 알아두면 좋은 점 – Zayats