2011-01-15 7 views
3

그래서 몇 시간 동안이 오류를 디버깅했습니다. Ogre3d를 사용하여 프로그램을 작성하는 것은 기호를로드하지 않기 때문에 충돌의 위치를 ​​찾기가 더 어려워지는 스택 추적을 허용하지 않기 때문입니다. 그래서 특정 기능을 호출하기 전에 "시작"을 인쇄 한 다음 기능을 호출하고 "중지"를 인쇄 한 직후에 작성하십시오. 함수를 통해 나는 함수 AF (F ')가 함수가 반환되기 전에 (F' '가 마지막'} '위의 한 줄) 인쇄 된 문자 AF를 인쇄합니다. 이상한 일은'F '가 인쇄 된 후에 충돌이 발생할 때이지만'멈추지 않습니다 '. 이것은 충돌이 어딘가에서 일어나고 있다는 것을 의미합니까? 내가 생각할 수있는 유일한 것은 함수 중에 할당 된 메모리의 일부를 할당 해제하는 동안 문제가있는 것입니다. 나는 결코 이런 일이 없었어요. 내가 생각하는 곳에서 그것이 잘못 될지를 계속 점검 할 것입니다.반환 함수가 중단 될 수있는 원인은 무엇입니까? C++

+2

모든 종류의 것들. 관련 코드를 표시하지 않는 이유는 무엇입니까? –

+0

아무거나 할 수 있습니다. 길잃은 포인터를 통해 스택을 엉망으로 만들었지 만 소멸자가 호출되면서 나타나는 버그와 비슷합니다. 가능하면 가장 작은 프로그램으로 문제를 재현 해보십시오. 코드를 게시하십시오 (프로세스가 버그를 발견하지 못한 경우). 건배, –

+0

코드를 게시하지 않으면 알려줄 수 없습니다. – Puppy

답변

4

뭔가 이상하고 이해할 수없는 일이 발생하는 대부분의 경우는 다른 이유로 인해 발생합니다.

코드에 dangling pointers (그 기능에서 멀리 떨어져있는 곳에서도) 임의의 메모리 셀을 가리킬 수 있습니다.

그런 매달려있는 포인터를 사용했을 수 있으며, 필요한 메모리 셀을 덮어 쓸 수 있습니다. 그 결과 다른 곳에서 정의 된 일부 변수, 일부 상수 또는 일부 코드를 변경하여 프로그램의 동작을 변경했습니다!

Valgrind과 같은 잘못된 메모리 액세스를 검사하고보고 할 수있는 몇 가지 도구를 사용하여 응용 프로그램을 디버깅하는 것이 좋습니다. 그 소리가 있지만,이 함수의 단순한 오류 일 수 있습니다 - 당신은 당신의 사고의 원인을 현지화하고 여기에 포스트를 충돌하는 코드의 정말 작은 조각을 쓸 수 있습니다 어쨌든 경우


드물지만, 당신의 설명에서.

+0

내가 아래에 언급 한 것처럼 분명히 나는 ​​인덱스 된 배열 (나는 100을위한 공간을 할당하고 그 위에 인덱스에 쓰고 있었다) 밖의 메모리에 쓰고 있었다. 그러나 이것은 충돌을 일으키지 않았고, 나는 그것을 추측하고있다. 그 프레임 밖에서 스택을 엉망으로 만들었고, 그것이 돌아 왔을 때 모든 것이 엉망이되었습니다. 나는 왜 내가 그 데이터로 노는 것을 허용하는지 혼란스러워했다. – JeanOTF

+0

C++는 관리되는 언어가 아닙니다. 컴파일러는 가능한 모든 것을 정적으로 검사하려고 시도하지만 런타임 검사는 실행하지 않습니다. 런타임시 오류가 발생합니다 (코드를 정적으로 분석하면 컴파일러에서 _right_ 배열 요소에만 액세스할지 여부를 말할 수 없습니다). Valgrind는 런타임에 무슨 일이 일어나는지 확인하는 도구입니다. 기본적으로 관리되는 언어의 가상 컴퓨터가 수행하는 작업의 일부입니다. – peoro

+0

그래, 내가 생각하기에 내가 기억하지 못하는 이유는 내가 만든 프로그램에서 할당 된 메모리가 아니기 때문에 나는 세그 폴트를 얻을 것이다. 힙 기반 배열입니다. 어쩌면 그랬 겠지. – JeanOTF

2

아마도은 함수가 반환되고 일부 소멸자가 실행 중일 때 오류가 발생하고 있음을 의미합니다. 가능성이있는 소멸자가 있습니다. 소멸자가 소유하지 않은 메모리를 해제하거나 로그의 일부 버퍼 끝을 씁니다.

플러시하지 않는 경우주의해야 할 또 다른 가능성이 나타날 수 있습니다. 출력 스트림. "Stopping"이 인쇄되고 있지만 stdout을 치기 전에 버퍼링 중일 수 있습니다. 그 일이 벌어지면 틀린 나무를 짖을 것이기 때문에 이것을 확인하십시오.

+0

그것이 무엇인지 알게 된 것은 매우 이상합니다. 배열 (100 크기)에 대한 공간을 할당했지만 100을 넘는 값을 수정했습니다. 이상한 부분은 이것이 할 수있는 문제가 아니 었습니다. 나는 그것이 프레임 레지스터 (나는 추측하고있다) 밖의 메모리를 통해 썼다는 사실을 해제 또는 더 구체적으로 알지 못한다. 그리고 메모리가 돌아 왔을 때 뒤죽박죽이고 잘못되었다. – JeanOTF

+0

@ JeanOTF- 그렇다면 할당 된 블록의 바닥 글에 일부 데이터를 덮어 썼을 가능성이 큽니다.메모리 할당자가 그것을 되찾기 위해 노력했을 때, 그것은 일종의 내부 데이터 (예를 들어, 다음 블록에 대한 포인터)를 찾을 것이기 때문에 아마도 충돌을 일으켰지 만, 대신 쓰레기를 발견했습니다. 이것은 항상 발생합니다. – templatetypedef

관련 문제