c++ - 如何调试 msvcp100d.dll 中的崩溃

标签 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));
}

最佳答案

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

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

关于c++ - 如何调试 msvcp100d.dll 中的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15280314/

相关文章:

android - C++:执行命令并返回输出导致断言失败

c++ - 为什么可执行文件必须重新编译

c++ - Microsoft 的源注释语言 (SAL)——有什么方法可以利用它?

c++ - pugixml "extend"元素添加值

c++ - 如何打印 for 循环变量的所有值?

C++父类(super class)和子类

visual-c++ - 使用自定义 ICU 构建和使用 Boost for Windows Visual Studio

visual-studio - 在 Visual Studio 的链接命令上取消/调试

php - 向/从服务器 cocos2d-x 发送/检索 xml 文件