2012-06-19 2 views
3

C++ 예외와 달리 액세스 위반은 응용 프로그램 런타임이 손상되어 응용 프로그램의 상태가 정의되지 않았 음을 나타냅니다. 그 상황에서 가장 좋은 방법은 응용 프로그램을 종료하는 것입니다 (일반적으로 충돌 때문에 종료됩니다).왜 액세스 위반이 발생합니까?

이러한 예외 중 하나를 포착하는 것이 가능하다는 점에 유의하십시오. 예를 들어 Microsoft Visual C++에서는 /EHa 또는 __try/__catch을 사용하면됩니다.

그래서 당신이 그들을 붙잡고 싶을 이유가 무엇입니까? 내가 알기에, 당신의 응용 프로그램을 복구 할 수있는 방법은 없습니다.

+2

사용자가 충돌 할 때 일반적으로 사용자에게 불쾌한 행동을 할 수 있습니다. 예를 들어 어떤 이유로 든 작업 표시 줄을 비활성화했을 수 있습니다. 완료되기 전에 되돌릴 지 확인해야합니다. – chris

+0

하지만 런타임이 손상되면 코드 정리 작업을 계속할 확률은 어느 정도입니까? – Chimera

+0

나는 최악의 경우 응용 프로그램이 다운 될 수 있다고 생각합니다. ;-) – PaulH

답변

6

하나의 이유는 크래시 덤프 파일을 작성하는 것일 수 있습니다. 당신은 그것을 더 잘 제어 할 수 있고 당신이 원하는 정확한 타입을 쓸 수 있어야합니다. 예를 들어, Windows에서는 MiniDumpWriteDump으로 전화하여이를 수행 할 수 있습니다.

+1

이것은 상황에 따라 사람이 원하는 가장 가능성있는 일처럼 보입니다. 그럴듯한 대답을 한 다른 모든 사람들에게 +1. 더구나, 동료는 Doug Harrison에 의해 기사의 거울에 몇몇 좋은 정보에 지시했다 : http://www.360doc.com/content/11/0411/10/6287626_108773107.shtml – PaulH

7

액세스 위반으로부터 복구 할 수 있습니다.

예를 들어, VirtualAlloc과 함께 일부 주소 공간을 할당하여 동적 배열을 만들 수 있지만 표시되지 않는 메모리를 표시합니다. 그런 다음 일부 메모리를 사용하려고하면 액세스 위반이 발생하여 액세스가 발생한 메모리 페이지를 매핑 한 다음 위반을 유발 한 지침을 다시 시도하십시오.

+4

당연히, 당신이 깊은 마술을 할 때 그런 당신과 다른 모든 관련 당사자들은 그들이하는 일을 알아야합니다. 그렇지 않으면 [bad stuff] (http://blogs.msdn.com/b/oldnewthing/archive/2006/09/27/773741.aspx)가 발생합니다. – delnan

1

나는 응용 프로그램을 사라지게하는 것보다 정상적으로 충돌하여 사용자에게 무슨 일이 일어나는지 알려주는 것이 더 좋을 것이라고 생각합니다.

1

응용 프로그램에 액세스 위반이있는 경우 복구 할 수도 그렇지 않을 수도 있습니다. 응용 프로그램이 정의되지 않은 상태로 남겨지면 예를 들어 스택을 마비 시키면 완료됩니다.

가출 포인터를 읽으면 응용 프로그램이 손상되지 않으므로 복구 할 수 있습니다.

어느 쪽이든 실제로 발생하고 있다는 사실은 코드에 버그가 있음을 나타내므로 복구를 시도하는 대신 오류를 catch하고 문제를 디버그하는 데 도움이 될 수있는 상태를 덤프해야합니다.

+0

불행히도 우리 중 많은 사람들이 다른 플랫폼과 상호 작용하는 코드를 작성하고 버그는 다른 코드에 있습니다. 이것을 분리하고 가능한 한 계속하려고하면 좋을 것입니다. – Tim

3

앱이 모든 액세스 위반 후 안정을 보장 할 수 없습니다. 그러나 안정 또는 일부 후 회복이되므로, 액세스 위반을 잡는 것은 당신에게 기회를 제공 할 수 있습니다

  1. 사용자 뭔가를 알려 갔다 나쁜
  2. 을 복구하는 작업
  3. 시도를 저장하는 사용자 시도하자
  4. 진단 정보를 기록하십시오.
  5. 사라지는 것이 아니라 원하는 방향으로 종료하십시오.

일반적인 예는 플러그인에서 예외를 캐치하는 호스트 응용 프로그램입니다. 이렇게하면 호스트 응용 프로그램 (예 : Photoshop)에서 사용자에게 "플러그인 X가 손상되고 Photoshop이 불안정합니다. 작업을 저장하고 Photoshop을 다시 시작해야합니다."라고 알릴 수 있습니다.

이것은 C++ 예외 처리와는 다른데, 이는 복구 할 수없는 오류를 나타내지는 않지만 스택 해제 기능에 더 가깝습니다.

관련 문제