2013-03-07 4 views
1

그래서 멀티 스레딩 디버그 런타임 DLL을 사용하여 Visual Studio 10에서 디버그 응용 프로그램의 오류가 발생합니다. 나는 인터넷 검색의 공평한 분배를 수행했으며, 다른 런타임 라이브러리 버전을 사용하는 외부 라이브러리에 링크하는 응용 프로그램에 대한 참조 만있었습니다 (여기서는 그렇지 않다고 생각합니다).msvcp100d.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++ 

편집 :

PUGI__FN std::wstring xml_node::to_wstr() const 
{ 
    xml_writer_string wsr; 
    this->print(wsr, L"", format_raw, encoding_wchar); 
    return wsr.mResult; 
} 
(수정과 pugixml 라이브러리를 사용하여) 요청에 따라, 다음과 같은 문제가 발생하는 코드 xmlMessage.to_wstr()와

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()); 

같이 구현되고

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)); 
} 
:

및 xml_writer_string는 다음과 같이 구현되는 0

+0

난 당신이 런타임 예외를 가지고 같은데요? 그렇다면 오류 코드는 무엇입니까? –

+0

재시작이 필요했습니다. 다음에 할 수있는 시간에 잡을 것입니다. '액세스 위반은 0xcccccd를 읽는 것'이었습니다. – Rollie

+0

코드의 문제 일 가능성이 큽니다. 당신은 잘못된 곳에서 문제를 찾고 있습니다. 액세스 위반을 일으키는 코드를 게시 한 경우 유용 할 수 있습니다. –

답변

1

단서는 '액세스 위반 읽기 0xcccccd'오류입니다. 이 주소는 초기화되지 않은 변수의 디버그 빌드에 사용 된 패턴에 해당합니다. 그 주소에서 메모리를 읽으려고한다는 사실은 당신이 역 참조를하는 초기화되지 않은 포인터를 가지고 있음을 암시합니다. 이 오류가 발생하면 디버거의 스택 위로 이동하여 Locals보기의 모든 변수를 확인하십시오. 디스플레이 모드를 16 진수로 설정하면보기가 쉬워 져야합니다. 변수의 길이에 따라 0xCC, 0xCCCC 및 0xCCCCCCCC 값이있는 변수를 찾아야합니다. 그 중 하나라도 표시되면 초기화되지 않은 변수이며 충돌의 원인 일 가능성이 큽니다.

은 참조 : How to end up with a pointer to 0xCCCCCCCC

+0

알아두면 재미있을거야. 나는 그 장면을 볼 것이다. 그러나 나는 내가보고있는 위치에서 이런 종류의 오류를 어떻게받을 수 있는지 보지 못한다. – Rollie

+0

키 비트가 스택 위로 훨씬 올라갈 수 있습니다. 스택이 아닌 힙에 할당 된 초기화되지 않은 메모리에 해당 패턴이 사용되므로 다른 오류를 나타내는 CCCCCCCC 또는 CDCDCDCD인지 확인하십시오. 유용한 값 표는 다음과 같습니다. http://www.nobugs.org/developer/win32/debug_crt_heap.html –

+0

Debug 및 Release로 빌드 된 DLL 및 EXE를 혼합하면 이러한 예외가 발생할 수 있습니다. 디버그 런타임에 맞게 모든 모듈이 빌드되어 있습니까? –