4

이 질문에는 이미 답변이 있습니다.

나는 이것이 매우 모호하다는 것을 알고 있지만 이것은 내가 모을 수있는 전부이다. 누군가가 이것이 어떻게 일어날 지에 대한 통찰력이 있기를 바랍니다.

나는 Visual Studio 2012에 내장 된 Win 7 64 비트 시스템에서 실행중인 64 비트 프로그램을 가지고 있습니다.

다른 프로젝트 (dll로 컴파일 됨)에있는 클래스를 사용합니다. 이 클래스에는 스택 오버플로를 유발할 수있는 버그가있는 반복기가 있습니다. 버그 반복기를 호출하는 작업은 작업을 통해 호출됩니다.

그래서 내 프로그램에서 코드는 다음과 같이 보입니다.

new Task(()=>{
try
{
    DoWork(); //<-- buggy iterator is called inside
}
catch (Exception ex)
{
    //Exception reported to user
}
}).Start();

코드는 매번 동일한 데이터에서 실행되며 무작위 변수 또는 guid 생성이 필요하지 않으므로 매번 동일한 출력을 생성해야합니다.

대부분의 경우 충돌이 발생합니다.알 수없는 모듈에서 StackOverflowException이 발생합니다.(비록 그것이 정확히 어디에서 발생하는지에 대한 사실을 알고 있음에도 불구하고). 이런 일이 발생하면 오버플로가 발생한 지점에서 코드를 볼 수 없으며 try-catch 블록은 아무 것도하지 않습니다. 프로그램을 계속 실행할 수 없습니다 (디버깅을 사용하지 않으면 실행하면"프로그램을 닫아야 만 온라인으로 솔루션을 확인할 수 있습니다"시스템 창).

이제는 예외를 잡는 경우가 있습니다 (예외를 유발 한 코드의 올바른 위치가 표시됨). 이것은 무작위이지만 더 자주 작업을 중단하면 (작업 중에 무작위로 중단 점을 삽입하는 것처럼) 더 많이 발생하는 것으로 보입니다.

그러나 여전히 응용 프로그램을 계속할 수 없습니다. 예외는 StackOverflowException을 잡아 내야하는 try-catch 블록 내부에서 발생하지만 StackOverflowException이 Exception에 포함되어 있기 때문에 catch해야합니다. C #을 사용하면 두 가지를 모두 catch하고 SOE가 이미 E에 포함되어 있음을 명시 적으로 알려줍니다.

try-catch 블록 내부에서 고의적 인 스택 오버플로를 만드는 작은 프로그램을 만들려고했는데"프로그램을 닫아야 만 온라인으로 솔루션을 확인할 수 있습니다"시스템 윈도우를 올바르게 처리하는 대신에. 코드는 다음과 같습니다.

    private bool Overflow()
    {
        return Overflow();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        try { Overflow();}
        catch (StackOverflowException ex) { }
    }

따라서 몇 가지 질문이 있습니다.

질문 1:

StackOverflowExceptions를 잡을 수 있습니까? 어떻게해야합니까?

질문 2 :

스택 오버플로가 dll (동일한 솔루션의 다른 프로젝트)에서 발생하면 VS 2012 디버거가 "알 수없는 모듈"이라고 생각하게 만들 수 있습니까?

질문 3 :

왜 왜 부족한 악기로 어떤 험악한 마술 춤을하는 것이 그렇게 자주하지 않습니까? (즉, 진행중인 프로그램을 무작위로 끊는 것을 의미 함)

그냥 전반적으로, 무슨 일이 일어나고있는거야?

미리 감사드립니다.

2 답변


1

너는 잡을 수 없다.레알스택 오버플로 예외가 발생하여 작동하지 않습니다.

참조토론.

두 번째 질문에 답할 수는 없지만 "프로그램이 엉망이 됐어."

세 번째 질문 : 별도의 스레드에서 실행되기 때문에 실행 한 코드의 양은 프로그램을 중단 할 때마다 달라집니다. 당신이이 밑바닥까지 도달 할 수있는 유일한 방법은 지루한 line-by-line 디버깅이나 많은 Debug.WriteLine ()을 사용하는 것입니다.


  • 그 토론에서 그들은 만약 당신이 그것을 잡을 수 있다고 말한다.호스트에서 특히 StackOverflow 예외를 처리 할 수있는 호스트 환경에서 CLR이 실행 중입니다.. 이러한 예외를 처리 할 수 있도록하려면 어떻게해야합니까? - Istrebitel
  • 어떻게하면 CLR 환경을 호스팅 할 수 있습니까? 단순한 필사자는 SQL 서버 및 디버거와 같은 일을하기가 쉽지 않습니다. 만나다이리자세한 사항은. C ++로 호스트 작성을 준비하십시오. - Matthew Watson

0

1) .NET Framework 버전 2.0부터는 StackOverflowException 개체를 try-catch 블록에서 catch 할 수 없으며 해당 프로세스가 기본적으로 종료됩니다. 따라서 스택 오버플로를 감지하고 방지하기 위해 코드를 작성하는 것이 좋습니다. 예를 들어 응용 프로그램이 재귀에 의존하는 경우 카운터 또는 상태 조건을 사용하여 순환 루프를 종료합니다. CLR (공용 언어 런타임)을 호스팅하는 응용 프로그램은 CLR이 스택 오버플로 예외가 발생하는 응용 프로그램 도메인을 언로드하고 해당 프로세스를 계속 진행하도록 지정할 수 있습니다. 자세한 내용은 ICLRPolicyManager 인터페이스 및 호스팅 개요를 참조하십시오. (http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx)

연결된 질문


관련된 질문

최근 질문