そのため、マルチスレッド デバッグ ランタイム DLL を使用して、Visual Studio 10 でデバッグ アプリケーションがクラッシュします。私はかなりの割合でグーグル検索を行いましたが、別のランタイム ライブラリ バージョンを使用して外部ライブラリにリンクしているアプリケーションへの参照がいくつか見つかりました (ここではそうではないと思います)。
最後に目にするコードは_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));
}