그래서 모든 종류의 로깅을위한 로깅 라이브러리를 작성 중이며 테스트를 실행했을 때 충돌이 계속 발생했습니다. 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));
여러 스레드에서 스트림에 액세스하고 있습니까? – bames53
FWIW,'0xfeeefeee'는 MSVC 디버그 모드의 힙 할당 메모리입니다. – Cubbi
코드 제거를 시작하고 문제가 언제 사라지는 지 확인하십시오. – Mankarse