/MT/MD 구축을 충돌하지만,경우에만 디버거를 연결되어 있지 않:디버깅하는 방법?[중복]

StackOverflow https://stackoverflow.com/questions/811951

문제

이 질문은 이미 있는 대답을 여기:

나는 하나의 작은 하나의 스레드 C++응용 프로그램 컴파일과 링크를 사용하여 Visual Studio2005,사용하는 향상(crc,program_options 및 토),의 겉 핥기 STL,그리고 여러 다른 시스템 헤더가 있습니다.

(그것의 주요 목적은 에서 읽.csv 를 생성 및 사용자 정의합니다.dat 와 연결되었습니다.서 선언하는 구조이다"라고 설명한"형식.dat.)

이 도구는 충돌(에 액세스 위반 NULL)실행하면 외부 디버거만에 놓습니다.E.g.F5 키를 눌러 일으키지 않는 도구를 충돌,Ctrl+F5 않습니다.경 디버거를 연결,나는 이 스택:

ntdll.dll!_RtlAllocateHeap@12()  + 0x26916 bytes    
csv2bin.exe!malloc(unsigned int size=0x00000014)  Line 163 + 0x63 bytes C
csv2bin.exe!operator new(unsigned int size=0x00000014)  Line 59 + 0x8 bytes C++
>csv2bin.exe!Record::addField(const char * string=0x0034aac8)  Line 62 + 0x7 bytes  C++
csv2bin.exe!main(int argc=0x00000007, char * * argv=0x00343998)  Line 253   C++
csv2bin.exe!__tmainCRTStartup()  Line 327 + 0x12 bytes  C

라인 그것의 충돌에 다소 무해 보이는 할당:

pField = new NumberField(this, static_cast<NumberFieldInfo*>(pFieldInfo));

...나는 그것을 믿지 않에 도달했을 생성자를 아직,그것은 단지 메모리 할당 점프하기 전에 생성자입니다.그것은 또한 실행된 이 코드는 수십번 시간에 의해 충돌이 일반적으로 일관된다(그러나 그렇지 않으면 비심)위치에 있습니다.

이 문제를 컴파일하는 경우 MTd/또는 MDd(런타임 디버그),그리고 다시 올 때 사용하여/MT/MD.

NULL 로드 스택에서,나는 그것을 볼 수 있는 메모리에서 보기입니다._RtlAllocateHeap@12+0x26916 바이트처럼 보인다 오프셋,다음과 같이 잘못된 이동되었습니다.

해봤 _HAS_ITERATOR_DEBUGGING 디버그 빌드에서 과하지 않은 것을 가지 의심스러운 아무것도.

반납 HeapValidate 에는 시작과 끝의 레코드::addField 여 확인 힙를 앱에서 충돌이 발생하는 경우.

이 작업에 사용되는--나는 완전히 확실하지 않은 무엇이 변경되는 지금 마지막으로 우리는 컴파일 도구를(아마 년 전,어쩌면에서는 오래된 VS).우리가 이전 버전의 부스트(1.36 대 1.38).

하기 전에 반드시 수동으로 조사한 코드 또는 먹이를 PC 린 빗질을 통해 출력에 어떤 제안하는 방법을 효과적으로 디버그 이?

[나는 행복할 것이 업데이트 질문에 자세한 정보는 경우에,당신은 정보를 요청합니다.]

도움이 되었습니까?

해결책

디버거가 부착 된 달리기의 차이점은 OS 디버그 힙입니다 (또한 참조하십시오. 디버거가 부착되었을 때 왜 내 코드가 천천히 실행됩니까??). 환경 변수 _NO_DEBUG_HEAP를 사용하여 디버그 힙을 끌 수 있습니다. 컴퓨터 속성 또는 Visual Studio의 프로젝트 설정에서이를 지정할 수 있습니다.

디버그 힙을 끄면 디버거가 부착 된 상태에서도 동일한 충돌이 발생합니다.

즉, 부패의 실제 원인 (일부 버퍼 오버런과 같은)이 증상 (충돌)을 볼 수있는 곳에서 멀어 질 수 있으므로 메모리 손상은 디버깅하기가 어려울 수 있습니다.

다른 팁

응용 프로그램 검증 자 환경에서 _NO_DEBUG_HEAP = 1이 있으면이 문제를 해결하기에 매우 사용이 적었습니다. 여기에서 허용 된 답변을 참조하십시오. 기억이 마지막으로 해방 된 곳을 찾으십니까?

아마도 언급 할 가치가있을 것입니다 PageHeap, 응용 프로그램 검증자를 보면서 찾은 것입니다. 비슷한 근거를 덮는 것 같습니다.

(FYI, 그것은 1 자체 버퍼 오버플로였습니다.

m_pEnumName = (char*)malloc(strlen(data) /* missing +1 here */);
strcpy(m_pEnumName, data);

... 사용하지 않는 또 다른 엄청나게 좋은 주장 strcpy 곧장.)

충돌 안에 새로운 또는 malloc 일반적으로는 힌트는(내부)구조물의 malloc 구현에 오류가 있습니다.이는 대부분의 시간에 의해 수행 쓰는 과거의 이전을 할당(buffer overflow).그런 다음에 대한 다음 호출하여 새로운 또는 malloc 응용 프로그램의 충돌 내부 구조가 포함되어 잘못된 데이터가 있습니다.

체크인 경우에 당신을 덮어쓸 수 있다 모든 이전에 할당된 공간입니다.

하는 경우 응용 프로그램은 휴대용할 수 있습을 구축하려고 그것은 리눅스에서와 실행의 밑에 그것을 Valgrind.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top