code

"이 응용 프로그램이 런타임에 비정상적인 방식으로 종료하도록 요청했습니다"의 원인은 무엇입니까?

codestyles 2020. 12. 13. 09:33
반응형

"이 응용 프로그램이 런타임에 비정상적인 방식으로 종료하도록 요청했습니다"의 원인은 무엇입니까?


Visual C 런타임에서 발생하는 일반적인 오류가 있습니다.

이 애플리케이션은 비정상적인 방법으로 런타임을 종료하도록 요청했습니다.
자세한 내용은 응용 프로그램의 지원 팀에 문의하십시오.

이 오류 메시지는 실제로 무엇을 의미 합니까?


내가 무엇을 요구하는지 정확히 설명하기 위해 비유를 사용하겠습니다.

메시지가 표시되는 경우 :

예외 : 액세스 위반 (0xc0000005), 주소 0x702be865

액세스 위반 은 성희롱 또는 내 컴퓨터에 침입하려는 누군가와 관련이 없습니다 (General Failure 이상은 내 C 드라이브를 읽으려고 시도한 준장이었습니다. Windows 95에서 잘못된 작업).

이 경우 액세스 위반 은 상수 EXCEPTION_ACCESS_VIOLATION( winbase.h값 0xC0000005로 선언 됨)에 해당합니다 . 이 상수는 EXCEPTION_RECORD구조 에서 반환 될 수있는 하나의 가능한 예외 오류 코드입니다 . 이 코드 ACCESS_VIOLATION는 프로그램이 메모리의 주소를 읽거나 쓰지 말아야한다는 것을 의미합니다. 할당되지 않은 메모리 주소에서 읽으려고하면 끔찍하게 나쁜 일을하는 것입니다. 예외는 그렇게 알려줍니다.

그것은됩니다 일반적으로 프로그램이되지 않습니다, 또는 더 이상 유효 메모리에 대한 포인터가있을 때 발생합니다. 해결책은 유효하지 않은 메모리에 액세스하려는 시도를 중지하는 것입니다.

참고 : 나는 묻지 않습니다 .

  • x 프로그램 에 C0000005 오류가 발생하는 이유는 무엇입니까?
  • 내 코드에 액세스 위반이 발생하는 이유는 무엇입니까?
  • 액세스 위반을 어떻게 디버깅합니까?

따라서 액세스 위반의 원인이 무엇인지 물어 보면 스택 추적을 확인하거나 출력 창을 보거나 샘플 코드를 게시하라고 말하지 않을 것입니다. "유효하지 않은 메모리에 액세스하려고했기 때문입니다." 라고 말할 수 있습니다.


내 질문으로 돌아갑니다. 다음 오류는 무엇을 의미합니까?

이 애플리케이션은 비정상적인 방식으로 종료되도록 런타임을 요청했습니다.

나는 Microsoft Visual C Runtime 라이브러리에 기능이 없다는 것을 (상당히) 확신합니다.

void TerminateRuntime(bool UnusualWay);

그래서 나는 그것이 실제로 무엇을 의미하는지 알아 내려고 노력해야합니다.

  • Visual C 런타임 라이브러리 종료 한다는 것은 무엇을 의미 합니까? (msvcrt는 dll입니다. 종료하지 않고 더 이상 사용하지 않습니다.)
  • MSVCRT를 종료 하는 일반적인 방법 은 무엇입니까 ?
  • 누군가 비정상적인 방법으로 그것을 종료하기로 선택 할까요?
  • 오늘날의 비정상적인 방법은 실제로 사용되지 않는 형식의 일반적인 방법 이었습니까?
  • 내가하면 되었다 (실수) 비정상적인 방법으로 그것을 종료, 무엇을 나는 그것을 종료 할 것 일반적인 방법은?

즉, MSVCRT는 어떤 오류를 포착하고 정보가없는 오류 메시지 뒤에 숨어 있습니까?


abort()함수가 호출 되면 해당 메시지가 표시됩니다 .

MSDN에서 :

중단

현재 프로세스를 중단하고 오류 코드를 반환합니다.

void abort( void );

반환 값

abort 는 호출 프로세스에 제어를 반환하지 않습니다. 기본적으로 현재 프로세스를 종료하고 종료 코드 3을 반환합니다.

비고

기본적으로 중단 루틴은 다음 메시지를 인쇄합니다.

"이 응용 프로그램은 비정상적인 방법으로 런타임을 종료하도록 요청했습니다. 자세한 내용은 응용 프로그램 지원 팀에 문의하십시오."

최신 버전의 VC 런타임에서 메시지가 실제로 의미하는 바를 명확히하기 위해 "abort ()가 호출되었습니다"로 대체 된 것 같습니다. 해당 메시지를 재현하려면 이전 VC 런타임 (확실히 VC ++ 6.0)을 사용하고 abort().

내부적으로를 abort()호출하면 internal.h 에 정의 된 _amsg_exit 함수를 호출합니다.이 함수 는 기본적으로 "콘솔 응용 프로그램의 경우 stderr에 런타임 오류 메시지를 내보내 거나 Windows 응용 프로그램의 경우 메시지 상자에 메시지를 표시합니다." "이 응용 프로그램이 비정상적인 방법으로 런타임을 종료하도록 요청했습니다"에 대한 오류 메시지는 cmsgs.h에 정의되어 있습니다.

cmsgs.h :

#define _RT_ABORT_TXT  "" EOL "This application has requested the Runtime to terminate it in an unusual way.\nPlease contact the application's support team for more information." EOL

( _RT_ABORT)에 전달 된 오류 코드 는 rterr.h에 정의되어 있습니다.

rterr.h

#define _RT_ABORT  10  /* Abnormal program termination */

따라서 또는 다음을 호출하여이를 재현 할 수 있습니다. _amsg_exit( _RT_ABORT )


질문 포스터 별 업데이트 :이 질문을 한 지 2 주 후 Raymond Chen이 자신의 블로그에서 답변했습니다 .

프로그램을 실행하고 있는데 갑자기이 응용 프로그램이 런타임에 비정상적으로 종료하도록 요청했습니다. 라는 메시지와 함께 종료됩니다 . 어떻게 된 거예요?

이 메시지는 C 런타임 함수 abort에 의해 인쇄 됩니다.이 함수는 프로그램이 종료 코드 3으로 종료되도록합니다 .

프로그램은 abort를 명시 적으로 호출하거나 런타임 라이브러리 자체에 의해 암시 적으로 호출 될 수 있습니다.

The C++ standard spells out the conditions under which terminate is called, and it's quite a long list, so I won't bother repeating them here. Consult your favorite copy of the C++ standard for details. (The most common reason is throwing an unhandled exception.)

참고URL : https://stackoverflow.com/questions/8177152/what-is-the-cause-of-this-application-has-requested-the-runtime-to-terminate-it

반응형