在发布模式下构建后,我看到了在调试模式下没有发生的异常。在调试发布版本时,看起来字符串引用没有正确地从 EXE(我们的应用程序)传递到接收字符串引用的 DLL。
我们的 EXE 代码如下所示:
string contents = "handle_message(): received=" + msg->encode();
LOG4CXX_DEBUG(logger, contents);
LOG4CXX_DEBUG
is going to ,其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
这个问题是因为他们使用不同的运行时版本吗?