2011-12-14 7 views
0

私はあらゆる種類のログを記録するためのロギングライブラリを作成しています。テストを実行すると、クラッシュすることがありました。私は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));

+0

複数のスレッドからストリームにアクセスしていますか? – bames53

+1

FWIW、 '0xfeeefeee'は、MSVCデバッグモードのヒープ割り当てメモリです。 – Cubbi

+0

コードの削除を開始し、問題がなくなるのを見てください。 – Mankarse

答えて

0

.c_str()関数はostreamに出力の問題を引き起こす可能性のポインタを返します。

ブロック外に変換する必要がある場合を除き、< <の結果をc文字列に変換せずに渡して問題が解決するかどうかを確認してください。

+0

ofstreamオブジェクトはstd :: string型をサポートしていないので、私が知る限り、文字列クラス内の変換は必要です。 – Zayats

+1

ストリームオブジェクトの@Zayatsは 'std :: string'sの出力をサポートしています。あなたは '#include 'を忘れましたか?彼らは – Cubbi

+0

ですか?まあそれは新しいです。私はを含んだ。私がC++文字列またはC文字列を渡すと同じエラーが発生するので、とにかく問題はありません。それでも、将来の参照のために知っておくとよい – Zayats