1

そのため、マルチスレッド デバッグ ランタイム 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));
}
4

1 に答える 1

1

ここでの手がかりは、「アクセス違反読み取り 0xcccccd」エラーです。そのアドレスは、初期化されていない変数のデバッグ ビルドで使用されるパターンに対応します。そのアドレスでメモリを読み取ろうとしているという事実は、逆参照している初期化されていないポインターがある可能性があることを示唆しています。このエラーが発生した場合は、デバッガーでスタックを調べて、[ローカル] ビューですべての変数を確認します。表示モードを 16 進数に設定すると、見やすくなります。変数の長さに応じて、値が 0xCC、0xCCCC、0xCCCCCCCC の変数を探す必要があります。変数が表示された場合、これらは初期化されていない変数であり、クラッシュの原因である可能性が最も高いです。

参照: 0xCCCCCCCC へのポインターで終了する方法

于 2013-03-07T21:41:09.980 に答える