Как отладить сбой в msvcp100d.dll

Так что я получаю сбой отладочного приложения в 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));
}

1

Решение

Подсказка здесь — ошибка «нарушение прав чтения 0xcccccd». Этот адрес соответствует шаблону, используемому в отладочных сборках для неинициализированных переменных. Тот факт, что он пытается прочитать память по этому адресу, предполагает, что у вас может быть неинициализированный указатель, который вы затем разыменовываете. Когда вы нажмете эту ошибку, поднимитесь по стеку в отладчике, проверив все переменные в представлении Locals. Установите режим отображения на шестнадцатеричный, и тогда его будет легче увидеть — вам нужно искать переменные со значениями 0xCC, 0xCCCC и 0xCCCCCCCC, в зависимости от длины переменной. Если вы видите что-то, то это неинициализированные переменные, и это, скорее всего, причина вашего сбоя.

Смотрите также:
Как в итоге получить указатель на 0xCCCCCCCC

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]