因此,我在 Visual Studio 10 中使用多线程调试运行时 DLL 导致调试应用程序崩溃。我已经做了相当多的谷歌搜索,我唯一能找到的是一些对使用不同运行时库版本链接到外部库的应用程序的引用(我不相信这里是这种情况)。
我看到的最后一段代码是 的定义_Lockit::_Lockit(3)
,它调用_Mtxlock(&mtx[3]);
,其中mtx
是关键部分的数组。如何调试此类错误,我认为它只会间歇性地发生?请注意,在这种情况下被破坏的字符串是从函数中临时返回的,因此它不可能被破坏甚至在其他地方引用。
ntdll.dll!76fbb42b()
ntdll.dll!76fbb3ce()
ntdll.dll!76f70133()
msvcp100d.dll!std::_Lockit::_Lockit(int kind) Line 64 + 0x14 bytes C++
msvcp100d.dll!std::_Container_base12::_Orphan_all() Line 200 C++
MyExe.exe!std::_String_val<wchar_t,std::allocator<wchar_t> >::~_String_val<wchar_t,std::allocator<wchar_t> >() Line 478 + 0xb bytes C++
MyExe.exe!std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::~basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >() Line 754 + 0xf bytes C++
编辑:根据请求,导致问题的代码如下(使用 pugixml 库,有修改)
xml_document xmlMessage;
xml_node pRoot = xmlMessage.append_child(L"event");
pRoot.append_child(L"id", to_wstr(id).c_str());
Instance().SendMessage(xmlMessage.to_wstr());
xmlMessage.to_wstr() 被实现为:
PUGI__FN std::wstring xml_node::to_wstr() const
{
xml_writer_string wsr;
this->print(wsr, L"", format_raw, encoding_wchar);
return wsr.mResult;
}
和 xml_writer_string 被实现为:
class PUGIXML_CLASS xml_writer_string : public xml_writer
{
public:
// Construct writer from an output stream object
virtual void write(const void* data, size_t size);
std::wstring mResult;
};
PUGI__FN void xml_writer_string::write(const void* data, size_t size)
{
mResult += std::wstring(static_cast<const wchar_t*>(data), size / sizeof(wchar_t));
}