1

因此,我在 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));
}
4

1 回答 1

1

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

另请参阅: 如何以指向 0xCCCCCCCC 的指针结束

于 2013-03-07T21:41:09.980 回答