0

そこで、あらゆる種類のものをログに記録するためのログ ライブラリを作成しています。テストを実行すると、クラッシュし続けました。ログメッセージを ofstream ファイルに書き込むときの書き込み関数に例外を絞り込みました。メッセージなどを解析してから、実際に 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 ブロックで呼び出しを行っており、ファイルが有効で開いているかどうかも確認しています。呼び出しとその周りにブレークポイントを設定すると、呼び出しは正常に機能しますが、関数の最後に到達すると、次のようになります。

LoggerTest.exe の 0x773515ee で未処理の例外: 0xC0000005: アクセス違反の書き込み場所 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));

4

1 に答える 1

0

.c_str()関数はポインターを返します。これにより、ostream出力で問題が発生する可能性があります。

このブロックの外で変換する必要がある理由がない限り、ac文字列に変換せずに<< resultを渡すだけで、問題が解決するかどうかを確認できます。

于 2011-12-14T03:50:47.003 に答える