2016-10-31 2 views
3

일부 게임을 추가하기 전까지 게임을하고 있으며 모든 것이 잘되어있었습니다. 나는이 기능에 대해 약 한 달 동안 일했고 불행히도 코드의 작은 부분을 테스트하는 것이 현명하지 않아 많은 코드를 추가 했으므로 이제이 오류가 발생합니다.스택 오버플로 예외를 디버깅하는 방법은 무엇입니까?

Unhandled exception at 0x77555098 (ntdll.dll) in SFML setup.exe: 0xC00000FD: Stack overflow (parameters: 0x00000001, 0x006D2FA8). 

내 코드가 큽니다. 디버거 호출 스택에서이 특정 함수는 여러 번 반복됩니다.

void SceneNode::onCommand(const Command &command, sf::Time dt) 
{ 
    if (command.category.at(getCategory())) 
     command.action(*this, dt); 

    for(const Ptr& child : mChild) 
    { 
     child->onCommand(command, dt); 
    } 
} 

SceneNode는 트리 구조이며 일부 자식이 있습니다. 이 함수는 트리를 반복하여 어떤 노드가 특정 명령을 수행 할 수 있는지 확인하려고 시도합니다.

+2

우선 일에 정말 좋은 및 자세한 설명을 찾을 수 있습니다 위해 5 덤프 esp
그것은 같아야 스택 프레임을 검사합니다 ep : 다음 중 어떤 가능성이 적용됩니까? a) 노드 X의 자식 (또는 ... X의 자식)은 X 자체입니다. b) 일부 버그 코드는 많은 수의 중첩 된 자식을 삽입했지만 자식은 존재하지 않아야합니다. c) 데이터가 정상이며 스택이 실제로 너무 작습니다. – deviantfan

+1

Prime suspects :'command.action (* this, dt);'는이 함수를 호출하거나'this'는'mChild'의 원소입니다. 디버거의 호출 스택에있는'this' 포인터를보고 노드 트리에 루프가 있는지 확인하십시오. – molbdnilo

+0

제공된 정보를 기초로이 질문에 대답 할 수 없습니다. 오류를 나타내는 최소한의 작업 예제를 제공하십시오. 최소한의 작업 예제를 작성하면 일반적으로 문제를 식별하는 데 도움이됩니다. –

답변

0

"스택 오버플로 예외를 디버그하는 방법"질문에 대한 답변입니다.
1- 버그 재현 가능? (특히 (eip) 32 비트에 대한 ebp)
를 레지스터의 내용을 참조 예 경우/부착 앞서
2 가지 windbg를 (또는 올리 디버그 또는 기타)
3 트리거하여 예외
3-와 프로세스를 엽니 다

{ Local Var -> Saved EBP -> Saved EIP -> Params -> Address of Exception Handler } 

당신이 link