如何调试msvcp100 .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));
}

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

参见:如何以指向0xCCCCCCCC的指针结束

相关内容

  • 没有找到相关文章

最新更新