私はあらゆる種類のログを記録するためのロギングライブラリを作成しています。テストを実行すると、クラッシュすることがありました。私はofstreamファイルにログメッセージを書き込むときに、例外を書き込み関数に絞り込んだ。私はメッセージとstuffを解析し、次にofstream :: write()への実際の呼び出しを持っています。ここで私はreuntimeのエラーを取得する部分である: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);
}
}
あなたが見ることができるように、私は、try catchブロックでコールを持っており、ファイルが有効と開いている場合は私も確認してください。私はコールとその周辺のすべてのブレークポイントを設定すると、コールが正常に動作しますが、それは関数の最後に達すると、それはこの私を与える:
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