2014-09-12 1 views
1

나는 지금까지 작업 한 적이있는 가장 큰 프로젝트에 참여하고 있으며, 이런 식으로 디버깅을 해본 적이 없어서 어디서부터 시작해야할지 모르겠다. .내 프로그램에서 직접 사용하지 않는 memcpy의 가끔 충돌

충돌에 대한 정보 : Visual Studio를 사용하고 있으며 디버거는 완전히 쓸모가 없습니다. 그것이 나에게주는 유일한 정보는 "memcpy"호출 중에 일어나는 것처럼 보입니다. 호출 스택은 memcpy 함수를 제외하고는 완전히 비어 있으며 로컬 변수는 나열되지만 그 중 하나에 대한 값은 없습니다.

모든 컴퓨터에서 가끔 발생합니다.

어떤 알려진 조건에서도 항상 발생하는 것은 아니지만 몇 가지 조건에서만 발생합니다. 특히 그것은 직접적인 원인은 아니지만 특정 유형의 객체가 파괴 될 때만 발생하며 파괴 과정을 조사하는 것이 도움이되지 않았습니다.

프로젝트에 대해 조금 더 : 정적으로 연결된 SFML 2.0을 사용하는 게임입니다. 내 코드에서 memcpy를 아무 곳이나 호출하지 않습니다.

몇 가지 질문 : 어디에서 memcpy 호출이 올 수 있습니까? SFML 또는 다른 곳입니까? 어떻게 디버거가 작동하지 않을 때 Visual Studio를 사용하여 충돌에 대한 자세한 정보를 얻을 수 있습니까?

+2

코드에서 마지막으로 메모리 누수 감지기가 실행 된시기는 언제입니까? 코드에서 정적 분석기를 실행합니까? – Surt

+2

힙 손상과 같은 소리입니다. 에러는'memcpy' 호출에서 거의 확실합니다. 오래 전에 일어 났을 수도 있습니다. –

+0

'memcpy()'는 아마 문제를 확인하는 것일뿐입니다. 주요 버퍼 오버플로가있는 것처럼 들리므로 스택의 대부분이 무언가 (아마도이 ​​'memcpy()')에 의해 쓰레기로 쓰여지게됩니다. 이것은 아마 당신이 스택에 배열을 가지고 있다는 것을 의미 할 것이다. (N 요소를 말한다.) 그러나 당신의 코드는 어떤 식 으로든 M 요소가 배열에 M> N이라는 것을 추측하고있다. 그리고 이것은 호출 전에 유용한 정보를 파기하게된다. 'memcpy()'에 추가하십시오. 디버거는 휴지통 스택 정보를 사용하려고하기 때문에 이미 손상이 발생했기 때문에 도움이 될 수 없습니다. –

답변

1

이것은 "memcpy 호출은 어디에서 오는 것일까?"에 대한 대답입니다.

대부분의 경우 이것은 this 포인터가 NULL이거나 이미 삭제 된 문자열에 대한 문자열 연산을 사용하여 std :: string의 복사 생성자를 호출 한 결과입니다. 물론이 문자열은 당신 클래스의 멤버가 될 수 있습니다.

이 자체는 프로젝트가 실제로 커질 때 문제를 찾는 데 도움이되지 않습니다. 그러나 이미 파괴 된 사용자 정의 객체에 대한 참조 또는 포인터 (또는 반복자)를 사용하고 있다고 가정 할 수 있습니다. 이 액세스 권한을 찾는 가장 간단한 방법은 valgrind에서 최적화없이 디버그 정보로 컴파일 된 프로그램을 실행하는 것입니다. 불행히도 창문에서는 사용할 수 없습니다 (Is there a good Valgrind substitute for Windows? 참조).

여기서 중요한 문제는 백 트레이스를 얻지 못하는 것 같습니다. 그 이유는 적어도 살펴볼 곳을 찾는 데 도움이 될 것이기 때문입니다. 나는 창문에 익숙하지 않아서 그 원인이 무엇인지 짐작할 수 있습니다. 디버그 정보로 모든 것을 컴파일 했습니까?

+0

사실 그것은 나쁜 정적 캐스트로 인해 생성 된 나쁜 문자열 복사 생성자입니다. –

+0

기다려주세요. 스택 트레이스가 없으면 어떻게 될까요? 그리고 이것은 C++의 특정 것에 맞습니까? 나는 이것도 얻고있다 ... 나는 어떻게 문제가있을지를 발견하기 시작한다. – Joakim

관련 문제