2014-04-10 2 views
0

프로그램을 성공적으로 빌드했으며 잠시 동안 실행할 수 있습니다. 그런 다음 어느 시점에서 항상 충돌합니다. 프로그래밍에 익숙하지 않고 Visual Studio에서 알고있는 유일한 도구는 호출 스택을 사용하여 호출 할 함수를 추적하는 것입니다. 그러나 어떤 예외가 보이지 않거나 어설 션이 발생하지 않았기 때문에 어떤 함수가 실제로 문제를 일으켰는지 확인할 수 없습니다. 가능한 솔루션 또는 관련 자습서에 대한 지침에 대한 제안은 크게 감사하겠습니다.프로그램이 충돌하는 위치를 정확하게 지정하는 방법

+0

디버깅에 대해 들어 봤어? – CinCout

+1

http://msdn.microsoft.com/en-us/library/sc65sadd.aspx – jsantander

+1

"충돌"이란 정확히 무엇을 의미합니까? 사용자로서 작동을 멈추는 모든 것은 "추락"합니다. 그러나 프로그래머라면 더 정확하게 배우는 것이 필요합니다. 쉽게 마스터 할 수있는 스킬이 아니기 때문에 (전문가는 제한된 정보로 놀라운 것을 할 수 있습니다) 기본을 고르는 것이 필요합니다. – MSalters

답변

0

디버그 도구를 사용해 보셨습니까?

코드 왼쪽 (줄 번호 왼쪽)을 클릭하십시오. 빨간색 점이 나타납니다. 그런 다음 play (debug 옵션 사용)를 누르면 프로그램이 단계별로 수행하는 작업을 볼 수 있습니다.

오류가 발생하면 오류 코드가 출력됩니다. 그것이 무엇을 의미하는지 알아보십시오.

디버깅 훌륭한 도구입니다, 당신은 당신의 프로그램이 단계별로 진행 정확하게 볼이 충돌 위치를 확인할 수 있습니다.

이뿐만 아니라 기본적인있을 수 있습니다,하지만 난 실패 위치를 확인하기 위해 코드에 점진적으로 COUT 문을 추가 건의 할 것입니다. 당신이 배울해야합니다

0

우선 충돌이 원인, 그것이 나타 점을 가지고 있다는 것입니다. 그것들은 대개 동일하지 않습니다. 예를 들어 널 포인터를 역 참조하는 경우 충돌이 발생할 수 있습니다 (확실히 Visual Studio에서). 그러나 원인은 대개 일찍 검사해야합니다. 유사하지만 동일하지 - 충돌의

비슷한 유형이 삭제 된 포인터를 역 참조하면 경우에 발생할 수 있습니다. Visual Studio에서는 두 경우 모두 (C0000005) 액세스 위반이 발생하지만 오류 발생시 포인터가 다릅니다. 여기서 아무런 수표도 도움이되지 못했습니다. 스마트 포인터가 도움이되었을 것입니다.

강력한 도구는 클래스를 불변하는 클래스로 디자인하는 것입니다. 이 객체의 속성은 이며 항상입니다. 예를 들어 String 클래스에서 Invariant는 Size 속성이 문자열의 문자 수와 같을 것입니다. 이중 연결리스트의 경우, 순방향 및 역방향 포인터는 일관성이 있습니다. 일반적으로이 불변량은 private 데이터를 포함하며 모든 클래스 메서드는 불변성을 유지합니다. 다른 코드는 private 메소드에 접근 할 수 없으므로 invariant를 깨뜨릴 수 없습니다. 이 불변을 확인하는 (디버그) 함수를 추가하는 경우

, 당신은 객체가 여전히 유효 충돌에서 확인할 수 있습니다. 종종 단 하나의 깨진 물체가 있습니다. 그러면 버그가 private 데이터를 변경할 수있는 약간의 코드에 있어야한다는 것을 알게됩니다.

관련 문제