Так что я получаю сбой отладочного приложения в 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));
}
Подсказка здесь — ошибка «нарушение прав чтения 0xcccccd». Этот адрес соответствует шаблону, используемому в отладочных сборках для неинициализированных переменных. Тот факт, что он пытается прочитать память по этому адресу, предполагает, что у вас может быть неинициализированный указатель, который вы затем разыменовываете. Когда вы нажмете эту ошибку, поднимитесь по стеку в отладчике, проверив все переменные в представлении Locals. Установите режим отображения на шестнадцатеричный, и тогда его будет легче увидеть — вам нужно искать переменные со значениями 0xCC, 0xCCCC и 0xCCCCCCCC, в зависимости от длины переменной. Если вы видите что-то, то это неинициализированные переменные, и это, скорее всего, причина вашего сбоя.
Смотрите также:
Как в итоге получить указатель на 0xCCCCCCCC
Других решений пока нет …