如何在msvcp100d.dll中调试崩溃

时间:2013-03-07 19:45:46

标签: c++ visual-c++ pugixml

所以我使用多线程调试运行时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));
}

1 个答案:

答案 0 :(得分:1)

这里的线索是“访问违规读取0xcccccd”错误。该地址对应于用于调试未初始化变量的构建的模式。它试图在该地址读取内存这一事实表明您可能有一个未初始化的指针,然后您将其取消引用。当您遇到此错误时,请在调试器中向上走,然后检查Locals视图中的所有变量。将显示模式设置为十六进制,然后应该更容易看到 - 然后需要查找值为0xCC,0xCCCC和0xCCCCCCCC的变量,具体取决于变量的长度。如果您看到任何这些是未初始化的变量,这很可能是导致崩溃的原因。

另见: How to end up with a pointer to 0xCCCCCCCC