문제

나는 몇 가지 종류의 잡는 모든 예외 메커니즘에는 루트의 내 코드,그래서 때 응용 프로그램이 종료됩 예기치 않게 난 아직도 제공 몇 가지 유용한 기록합니다.

의 라인을 따라 뭔가

static void Main () {
    if (Debugger.IsAttached)
        RunApp();
    else {
        try {
            RunApp();
        }
        catch (Exception e) {
            LogException(e);
            throw;
        }
    }
 }

이 모든 작동,나의 문제를 디버거를 연결한 후에 예외가 발생하고있다.

이 예외는 이스케이프타,윈도우 프롬프트를 연결하는 visual studio 제외하고,되었기 때문에 다시 throw,모든 지역 주민과 매개 변수에 추가로 스택가 손실되었습니다.

은 어쨌든 로그인이 이러한 예외는 동안,아직도할 수 있는 방법을 제공하는 디버거를 연결하고 유지하는 모든 유용한 정보?

도움이 되었습니까?

해결책

Paul Betts가 이미 언급했듯이 AppDomain.unhandledException 시도/캐치 블록 대신 이벤트.

UnhandleDException 이벤트 핸들러에서 예외를 로그/표시 한 다음 디버그 옵션을 제공 할 수 있습니다. 예를 들어 예외 세부 정보와 버튼이있는 양식을 표시, 디버그 또는 종료 할 수 있습니다.

사용자가 디버그 옵션을 선택하면 호출하십시오 System.diagnostics.debugger.break () 이를 통해 사용자는 여전히 사용할 수있는 전체 통화 스택으로 원하는 디버거를 첨부 할 수 있습니다.

분명히, 당신은 당신이 디버거를 첨부하지 않을 것임을 알고있는 빌드에 대해이 옵션을 비활성화 할 수 있습니다.

class Program
{
    static void Main()
    {
        AppDomain.CurrentDomain.UnhandledException += ExceptionHandler;

        RunApp();
    }

    static void ExceptionHandler(object sender, UnhandledExceptionEventArgs e)
    {
        Console.WriteLine(e.ExceptionObject);
        Console.WriteLine("Do you want to Debug?");
        if (Console.ReadLine().StartsWith("y"))
            Debugger.Break();
    }

    static void RunApp()
    {
        throw new Exception();
    }
}

다른 팁

끔찍하게 해키지없이타 후크(한 것은 없)을 얻을 수있는 유일한 방법은 스 프레임을 던지고 있습니다....

모든 예외가 있는 것으로 알려진 터미널 던져 있어야에서는 다음을 그들의 생성자:

#if DEBUG
System.Diagnostics.Debugger.Launch()
#endif

이상 현저히 지장이 있다고 대화할 수 있도록 하거나 공급하는 관련 디버거 또는 선택이 없고 아무 디버깅이 발생(중 하나는 방법을 제외이 완료되고 건설 다음 발생합니다.이것은 분명히 에서만 작동 예외는 원본을 제어합니다.

내가 추천하지 않는 이 디버그 빌드에서와 디버거를 연결할 수 있는 선택을 얻을'첫 번째'에서 휴식을 예외를 던지고해야하는 일반적으로 충분합니다.

또 다른 옵션이 생성을 시작하려면 소형 덤프 프로그래밍 방식으로 예외에서 던져 사이트,이러한 데이터 수 있습 검사 후 같은 도구를 사용하 windbg 하지만 방해하지 않을 너무 많이하고 원하는 동작의 예외 스택을 해제한 후에.

는 행위의 예외에 도달 범 함정이 정확하게 스택을 풀고 싶지 않습니다.당신은 편안한 C++과 멋진 그것을 작성할 수 있는 사소한(하지만 복잡한 권리를 얻기 위)포크의 모노 발생하는 모든 예외를 트리거 디버거.또는 단지 재건하 모노의 BCL 예외 클래스와 같이 동일한 기능을 수행하기 위한..

Microsoft에서 Windows 오류 보고서를 받도록 등록하지 않는 이유는 무엇입니까? 체크 아웃 http://msdn.microsoft.com/en-us/isv/bb190483.aspx 세부 사항을 위해.

그렇게하고 싶지 않다면 isdebuggerpresent 함수를 사용할 수 있습니다 (http://msdn.microsoft.com/en-us/library/ms680345.aspx), 그리고 결과가 false 인 경우, 코드를 try-catch로 래핑하는 대신 appdomain.unhandledException 이벤트에 이벤트 핸들러를 추가하십시오 (http://msdn.microsoft.com/en-us/library/system.appdomain.unhandlexception.aspx)

단순히 수행해서는 안됩니다

Exception e1 = e;
LogException(e);
throw(e1);

캐치 내부에서 트릭을합니까 (적어도 외부 예외를 검사 할 수 있습니까)?

배포를 위해 디버그 모드를 개발하고 릴리스 모드를 사용하는 경우 System.Diagnostics.Debugger 클래스를 사용해 볼 수 있습니다.

catch (Exception e) {
#if DEBUG
            System.Diagnostics.Debugger.Launch()
#endif
            LogException(e);
            throw;
        }

Trace Log에 서면으로 예외 정보를 얻을 수 있습니다.

        private static void Main(string[] args)
    {
        try
        {
            // ...
        }
        catch (Exception exception)
        {
            System.Diagnostics.Trace.Write(exception);
            #if DEBUG
            System.Diagnostics.Trace.Write("Waiting 20 seconds for debuggers to attach to process.");
            System.Threading.Thread.Sleep(20000);
            System.Diagnostics.Trace.Write("Continue with process...");
            #endif
            throw;
        }
    }

사용 디버그 뷰 추적 로그를 표시합니다. 몇 초 동안 스레드를 멈추면 원래 예외를 잃지 않고 디버거를 첨부 할 시간이 줄어 듭니다.

글로벌 이벤트 중 어느 것도 작동하지 않으면 시도 할 수있는 것은 소프트웨어가 처리하는 모든 이벤트에서 오류 캐치를 넣는 것입니다. 이들의 용이성은 응용 프로그램의 복잡성에 따라 다릅니다. .NET 프레임 워크로 작성된 많은 응용 프로그램은 기존 응용 프로그램이든 웹 응용 프로그램이든 이벤트를 처리하도록 작성되었습니다. 이벤트 자체에 고리를 넣으면 필요한 스택에 정보를 보존 할 수 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top