操作
バグ #628
完了coil::Logger のバグ windows
ステータス:
終了
優先度:
通常
担当者:
-
対象バージョン:
-
開始日:
2009/05/22
期日:
進捗率:
100%
予定工数:
説明
Logger の windows の Unitテストでバグがありました。
- 現象
期待通りにログファイルが出力されない。 - 参考
Linuxでのテストでは問題なし。
本バグの前に以下の問題があり対応しています。
現象
LoggerTest.exe の 0x10491e36 (msvcp80d.dll) でハンドルされていない例外が発生しました
: 0xC0000005: 場所 0x1051618c に書き込み中にアクセス違反が発生しました。
原因
log_streambuf の sync() で Guard していないため。
対策
Guard guard(m_mutex); を追加しました。
ファイル
匿名ユーザー さんが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()をコールするように変更。
操作