가끔 내 프로그램이 종료 될 때 "ESP 값이 함수 호출을 통해 저장되지 않았습니다"라는 오류가 발생합니다. 오류는 아주 무작위로 재현하기가 어렵습니다.'ESP의 값이 함수 호출을 통해 저장되지 않았습니다'오류를 디버깅하는 방법은 무엇입니까?
어떻게이 오류 (VC++ 2008)를 디버깅합니까? 종료시에만 발생하므로 얼마나 까다로운가? 릴리스 모드에서도 오류가 표시됩니까?
가끔 내 프로그램이 종료 될 때 "ESP 값이 함수 호출을 통해 저장되지 않았습니다"라는 오류가 발생합니다. 오류는 아주 무작위로 재현하기가 어렵습니다.'ESP의 값이 함수 호출을 통해 저장되지 않았습니다'오류를 디버깅하는 방법은 무엇입니까?
어떻게이 오류 (VC++ 2008)를 디버깅합니까? 종료시에만 발생하므로 얼마나 까다로운가? 릴리스 모드에서도 오류가 표시됩니까?
이것은 프로그램의 일부가 스택에 쓴 것을 의미합니다. 그 나쁜. 이제는 종료 될 때 운이 좋았지 만 머지 않아 누군가 다른 곳에서 실패한 기능을 사용할 수 있습니다.
메시지가 사라지면 현재있는 기능을 볼 수 있습니다. 프로그램을 다시 실행하면 기능을 입력 할 때 esp
에 기록한 위치에 데이터 중단 점을 넣습니다. 그런 다음 함수의 끝까지 실행하십시오. 문제가되는 코드는 데이터 중단 점을 트리거합니다.
이것은 함수 호출 포인터가 잘못 선언 된 경우에 자주 발생하는 잘못된 호출 규칙을 가진 함수를 호출하거나 스택을 덮어 쓰는 것입니다.
이전 상태를 디버깅하려면 어떤 상황에서이 상황이 발생하는지 확인하십시오. 후자를 디버깅하려면 스택 할당 버퍼 오버런과 같은 것을 찾아야한다.
나는이 같은 문제가 있었는데 그것을 해결할 수있었습니다. 내 경우에는 일들이 매우 구체적 이었지만. 몇 가지 샘플 코드없이 게시하는 것은 어렵습니다. 이것이 문제의 원인이었습니다. 아래에서는 프로그램을 깨뜨린 것에 대한 예를 보여 드리겠습니다.
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*);
요약하면, 해당 클래스의 멤버 함수 포인터를 사용할 때 선언하지 마십시오!
다른 매개 변수와 잘못된 호출 규칙 (예 : 잘못된 매개 변수)으로 인해 발생할 수도 있습니다. 응용 프로그램이 f (a)로 DLL 함수를 호출하지만 DLL이 서명 f (a, b)로 컴파일 된 경우 – AshleysBrain
또는 사용 응용 프로그램이 이전 주문을 가정하는 동안 dll에서 함수 순서를 변경하기로 결정한 경우 COM의 정적 인터페이스 규칙을 위반할 때 –