プロジェクト

全般

プロフィール

バグ #628

coil::Logger のバグ windows

匿名ユーザー がほぼ15年前に追加. 約14年前に更新.

ステータス:
終了
優先度:
通常
担当者:
-
対象バージョン:
-
開始日:
2009/05/22
期日:
進捗率:

100%

予定工数:

説明

Logger の windows の Unitテストでバグがありました。
  • 現象
    期待通りにログファイルが出力されない。
  • 参考
    Linuxでのテストでは問題なし。
    本バグの前に以下の問題があり対応しています。
    現象
    LoggerTest.exe の 0x10491e36 (msvcp80d.dll) でハンドルされていない例外が発生しました
    : 0xC0000005: 場所 0x1051618c に書き込み中にアクセス違反が発生しました。
    原因
    log_streambuf の sync() で Guard していないため。
    対策
    Guard guard(m_mutex); を追加しました。
log0.log (6.55 KB) log0.log 期待通りの出力されていないログファイル 匿名ユーザー, 2009/05/22 10:45
log1.log (6.25 KB) log1.log 期待するログファイルの出力 匿名ユーザー, 2009/05/22 10:45
Logger.h (15.6 KB) Logger.h 匿名ユーザー, 2009/06/15 09:43

関連するチケット

関連している OpenRTM-aist - バグ #781: Windows上でのConsoleIn,ConsoleOutコンポーネントの動作不具合終了2009-07-09

履歴

#1 匿名ユーザー がほぼ15年前に更新

  • 現象:
    ログ情報が欠ける
  • 原因:
    sync()の処理中にテスト側の svc() の挿入演算子(<<)が実行され、sync()が終了する前に pptr() が更新されます。
    sync()ではStreamの出力後にpptr()をpbase()に戻しています。
    そのため、データ抜けが発生していました。
  • 対策:
    sync() 及び overflow()では、gptr()を制御してバッファからデータを読み取るように修正しました。
  • 現象:
    log_streamでログ出力がおかしい。
    log_stream で lock(),unlock() を使用してstreamに出力したが、ログの改行位置がおかしい。
  • 原因:
    coil::Mutex がグローバルに効いていなかったため、lock(),unlock()を行ってもログが正しく出力されませんでした。
    ::CreateMutex の第三引数(オブジェクトの名前)で NULL を指定していたため。
  • 対策:
    名前を指定するよにしました。 coil::Mutex::Mutex() を修正。
    const char * const mutex_name = "3ce37c45-706a-4f80-b02d-9dcbbe6a2d66"
    mutex_ = ::CreateMutex( &m_Security_attr,
    FALSE,
    mutex_name );
  • 現象:
    const char* の挿入とstd::string の挿入が混在した場合、const char* が先に出力されてしまう。
    以下のコードの場合
    coil::LogStreamBuffer logger;
    logger.addStream(std::cout.rdbuf());
    std::basic_ostream<char> out(&logger);
    std::string str("::");
    out <<"Logger"<<str<<"test_log_streambuf"<<ic<<std::endl;
    出力が Loggertest_log_streambuf:: となってしまう。(期待する出力は Logger::test_log_streambuf )
    posix版では現象が発生しない。
  • 原因:
    const char* の挿入の場合、streambuf の sputn() がコールされ、バッファの有無に関係なく、xsputn()がコールされ出力されます。
    std::string の挿入の場合、streambuf の sputc() がコールされ、バッファが設定されているかどうかチェックし設定されている場合、バッファに書き込みます。その後、フラッシュでsync()経由でxsputn()がコールされて出力されます。
  • 対策:
    xsputn()でバッファにデータがある場合はバッファのデータを出力してから引数を出力するように修正。
    xsputn()の他にデータを出力する関数(stream_sputn)を追加して、sync()からは stream_sputn()をコールするように変更。

#2 匿名ユーザー がほぼ15年前に更新

#3 匿名ユーザー がほぼ15年前に更新

  • ステータス新規 から 終了 に変更
  • 進捗率0 から 100 に変更

#4 匿名ユーザー が約14年前に更新

他の形式にエクスポート: Atom PDF