リリース モードでビルドした後、デバッグ モードでは発生しなかった例外が表示されます。リリース ビルドをデバッグすると、文字列参照が EXE (アプリケーション) から文字列参照を受け取る DLL に正しく渡されていないように見えます。
EXE コードは次のようになります。
string contents = "handle_message(): received=" + msg->encode();
LOG4CXX_DEBUG(logger, contents);
はLOG4CXX_DEBUG
、log4cxx.dll
コードは次のようになります。
CharMessageBuffer& CharMessageBuffer::operator<<(const std::basic_string<char>& msg) {
if (stream == 0) {
buf.append(msg);
} else {
*stream << msg;
}
return *this;
}
デバッガーでコール スタックを見て、ソースのあるフレームに移動すると、それがcontents
有効な文字列であることがわかりますsize=583, capacity=838
。
内側のフレームlog4cxx.dll
(スタックの上の次のフレーム) では、文字列参照が表示されます size=838, capacity=363113231
(値はすべてガベージです)。
アプリと log4cxx.dll は両方とも、同じランタイム設定 (/MD) を使用して同じマシンでコンパイルされましたが、Visual Studio のバージョンは異なります。log4cxx dll は Visual Studio 2008 を使用してコンパイルされ、アプリケーションは Visual Studio 2010 を使用してコンパイルされました。2 つのオブジェクトで dumpbin を実行すると、次のように表示されます。
私たちのアプリ (EXE)
MSVCP100.dll
MSVCR100.dll
log4cxx.dll (DLL)
MSVCP90.dll
MSVCR90.dll
この問題は、異なるランタイム バージョンを使用していることが原因ですか?