2009-10-19 3 views
2

가끔 내 프로그램이 종료 될 때 "ESP 값이 함수 호출을 통해 저장되지 않았습니다"라는 오류가 발생합니다. 오류는 아주 무작위로 재현하기가 어렵습니다.'ESP의 값이 함수 호출을 통해 저장되지 않았습니다'오류를 디버깅하는 방법은 무엇입니까?

어떻게이 오류 (VC++ 2008)를 디버깅합니까? 종료시에만 발생하므로 얼마나 까다로운가? 릴리스 모드에서도 오류가 표시됩니까?

답변

0

이것은 프로그램의 일부가 스택에 쓴 것을 의미합니다. 그 나쁜. 이제는 종료 될 때 운이 좋았지 만 머지 않아 누군가 다른 곳에서 실패한 기능을 사용할 수 있습니다.

메시지가 사라지면 현재있는 기능을 볼 수 있습니다. 프로그램을 다시 실행하면 기능을 입력 할 때 esp에 기록한 위치에 데이터 중단 점을 넣습니다. 그런 다음 함수의 끝까지 실행하십시오. 문제가되는 코드는 데이터 중단 점을 트리거합니다.

5

이것은 함수 호출 포인터가 잘못 선언 된 경우에 자주 발생하는 잘못된 호출 규칙을 가진 함수를 호출하거나 스택을 덮어 쓰는 것입니다.

이전 상태를 디버깅하려면 어떤 상황에서이 상황이 발생하는지 확인하십시오. 후자를 디버깅하려면 스택 할당 버퍼 오버런과 같은 것을 찾아야한다.

+0

다른 매개 변수와 잘못된 호출 규칙 (예 : 잘못된 매개 변수)으로 인해 발생할 수도 있습니다. 응용 프로그램이 f (a)로 DLL 함수를 호출하지만 DLL이 서명 f (a, b)로 컴파일 된 경우 – AshleysBrain

+0

또는 사용 응용 프로그램이 이전 주문을 가정하는 동안 dll에서 함수 순서를 변경하기로 결정한 경우 COM의 정적 인터페이스 규칙을 위반할 때 –

1

나는이 같은 문제가 있었는데 그것을 해결할 수있었습니다. 내 경우에는 일들이 매우 구체적 이었지만. 몇 가지 샘플 코드없이 게시하는 것은 어렵습니다. 이것이 문제의 원인이었습니다. 아래에서는 프로그램을 깨뜨린 것에 대한 예를 보여 드리겠습니다.

class MyClass; //Forward declaration 
typedef (MyClass::*CallBack)(Object*); 

새로운 콜백을 등록 할 때 프로그램이 현재 함수 호출을 떠날 때 프로그램이 충돌했습니다.

class ThisClass : public MyClass 
{ 
    //... 
} 
//... 

//... 
void ThisClass::Init(void) 
{ 
    Sys.RegisterCallBack((CallBack)&ThisClass::Foo); 
} //The program crashed at this line 

문제를 해결하기 위해 앞으로 선언문을 없애고 단순히 헤더 파일을 포함 시켰습니다.

#include "MyClass.h" 
typedef (MyClass::*CallBack)(Object*); 

요약하면, 해당 클래스의 멤버 함수 포인터를 사용할 때 선언하지 마십시오!

관련 문제