Project

General

Profile

Actions

バグ #628

closed

coil::Logger のバグ windows

Added by Anonymous over 15 years ago. Updated over 14 years ago.

Status:
終了
Priority:
通常
Assignee:
-
Target version:
-
Start date:
05/22/2009
Due date:
% Done:

100%

Estimated time:

Description

Logger の windows の Unitテストでバグがありました。
  • 現象
    期待通りにログファイルが出力されない。
  • 参考
    Linuxでのテストでは問題なし。
    本バグの前に以下の問題があり対応しています。
    現象
    LoggerTest.exe の 0x10491e36 (msvcp80d.dll) でハンドルされていない例外が発生しました
    : 0xC0000005: 場所 0x1051618c に書き込み中にアクセス違反が発生しました。
    原因
    log_streambuf の sync() で Guard していないため。
    対策
    Guard guard(m_mutex); を追加しました。

Files

log0.log (6.55 KB) log0.log 期待通りの出力されていないログファイル Anonymous, 05/22/2009 10:45 AM
log1.log (6.25 KB) log1.log 期待するログファイルの出力 Anonymous, 05/22/2009 10:45 AM
Logger.h (15.6 KB) Logger.h Anonymous, 06/15/2009 09:43 AM

Related issues 1 (0 open1 closed)

Related to OpenRTM-aist - バグ #781: Windows上でのConsoleIn,ConsoleOutコンポーネントの動作不具合終了07/09/2009

Actions
Actions #1

Updated by Anonymous about 15 years ago

  • 現象:
    ログ情報が欠ける
  • 原因:
    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()をコールするように変更。
Actions #2

Updated by Anonymous about 15 years ago

Actions #3

Updated by Anonymous about 15 years ago

  • Status changed from 新規 to 終了
  • % Done changed from 0 to 100
Actions #4

Updated by Anonymous over 14 years ago

Actions

Also available in: Atom PDF