다음을 통해 공유


앱 센터 충돌 오류 - Windows

중요합니다

Visual Studio App Center는 2026년 6월 30일까지 계속 지원되는 분석 및 진단 기능을 제외하고 2025년 3월 31일에 사용 중지되었습니다. 자세히 알아보기.

App Center 크래시는 앱이 크래시할 때마다 자동으로 크래시 로그를 생성합니다. 로그는 먼저 디바이스의 스토리지에 기록되며 사용자가 앱을 다시 시작하면 크래시 보고서가 App Center로 전송됩니다.

App Center SDK는 처리되지 않은 .NET 예외로 인한 크래시만 수집합니다. C 또는 C++를 사용하는 경우와 같은 네이티브 크래시를 수집하지 않습니다. 그러나 C++ 크래시가 있는 앱이 있는 경우 업로드 크래시 API를 통해 App Center에 업로드할 수 있습니다.

애플리케이션에서 SDK를 아직 설정하지 않은 경우 WPF/WinForms 시작 에 따릅니다.

WinForms 애플리케이션에서 처리되지 않은 예외

비고

이 섹션 및 다음 하위 섹션은 WinForms에만 적용됩니다. WPF에서 SDK를 통합하는 경우 이 섹션을 건너뛸 수 있습니다.

기본적으로 WinForms 애플리케이션에서 처리되지 않은 예외는 디버거가 연결되지 않은 경우 크래시(애플리케이션이 종료되지 않음)를 트리거하지 않습니다.

대신 Windows는 사용자에게 앱 실행을 계속하거나 종료하는 옵션을 표시하는 대화 상자를 표시합니다. 따라서 App Center SDK는 사용자가 종료 단추를 클릭하더라도 이러한 예외를 자동으로 캡처할 수 없습니다.

애플리케이션이 자동 종료될 때만 크래시가 App Center에 수집됩니다. App Center는 세션당 하나의 크래시만 지원합니다.

WinForms에서 처리되지 않은 예외를 보고하는 방법에는 두 가지가 있습니다. 애플리케이션이 처리되지 않은 예외에서 크래시되도록 구성하거나 실행을 계속하지만 처리되지 않은 예외를 런타임 오류로 보고하도록 구성할 수 있습니다.

크래시 발생시 종료하도록 애플리케이션 구성

이 방법은 App Center에서 처리되지 않은 예외를 크래시 로 보고하고 처리되지 않은 예외에서 애플리케이션을 종료하는 유일한 방법입니다.

이렇게 하려면 SDK를 초기화하기 전에 Windows 메서드를 호출합니다.

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
AppCenter.Start(...);

애플리케이션에서 이 옵션을 사용할 수 없는 경우 처리되지 않은 예외를 런타임 오류로 보고할 수 있습니다(아래 설명 참조).

처리되지 않은 예외를 런타임 오류로 보고

처리되지 않은 예외 후에 애플리케이션이 계속 실행되어야 하는 경우 App Center에서 예외를 크래시 로 보고할 수 없지만 대신 오류로 보고할 수 있습니다.

이렇게 하려면 다음 코드 샘플을 사용할 수 있습니다.

Application.ThreadException += (sender, args) =>
{
    Crashes.TrackError(args.Exception);
};
AppCenter.Start(...);

비고

디버거가 연결되면 처리되지 않은 예외로 인해 처리기가 연결Application.ThreadException 애플리케이션이 종료됩니다(크래시).

테스트 크래시 생성

App Center Crashes 기능은 SDK를 쉽게 테스트할 수 있도록 테스트 크래시를 생성하는 API를 제공합니다. 이 API는 디버그 및 릴리스 구성을 확인합니다. 따라서 릴리스 앱에서 작동하지 않으므로 디버깅할 때만 사용할 수 있습니다.

Crashes.GenerateTestCrash();

이전 충돌에 대한 자세한 정보 가져오기

App Center 크래시에는 앱이 충돌하는 경우에 더 많은 정보를 제공하는 두 개의 API가 있습니다.

이전 세션에서 앱이 충돌했나요?

SDK를 시작한 후 언제든지 이전 시작에서 앱이 충돌했는지 확인할 수 있습니다.

bool didAppCrash = await Crashes.HasCrashedInLastSessionAsync();

이는 크래시가 발생한 후 앱의 동작 또는 UI를 조정하려는 경우에 유용합니다. 일부 개발자는 사용자에게 사과하기 위해 추가 UI를 표시하거나 충돌이 발생한 후 연락할 방법을 원합니다.

비고

이 메서드는 Crashes가 시작된 후에만 사용해야 합니다. 시작하기 전에 항상 false을 반환합니다.

마지막 충돌에 대한 세부 정보

앱이 이전에 충돌한 경우 마지막 충돌에 대한 세부 정보를 얻을 수 있습니다.

ErrorReport crashReport = await Crashes.GetLastSessionCrashReportAsync();

비고

이 메서드는 Crashes가 시작된 후에만 사용해야 합니다. 시작하기 전에 항상 null을 반환합니다.

이 API에는 다양한 사용 사례가 있으며, 가장 일반적인 사용 사례는 이 API를 호출하고 사용자 지정 크래시 대리자 또는 수신기를 구현하는 사용자입니다.

App Center 크래시에 대한 사용을 맞춤 설정하기

App Center 충돌 관리 시스템은 개발자가 크래시 로그를 App Center로 보내기 전에 또는 보낼 때 추가 작업을 수행할 수 있는 콜백을 제공합니다.

비고

App Center가 시작 직후에 크래시 처리를 시작하기 때문에 호출AppCenter.Start() 콜백을 설정합니다.

크래시가 처리되어야 하나요?

특정 크래시가 처리되어야 하는지 여부를 결정하려면 이 콜백을 설정합니다. 예를 들어, 무시하고 App Center로 보내지 않으려는 시스템 수준의 충돌이 있을 수 있습니다.

Crashes.ShouldProcessErrorReport = (ErrorReport report) =>
{
    // Check the report in here and return true or false depending on the ErrorReport.
    return true;
};

사용자 개인 정보가 중요한 경우 App Center에 크래시 보고서를 보내기 전에 사용자 확인을 받을 수 있습니다. SDK는 충돌 보고서를 보내기 전에 사용자 확인을 기다리도록 App Center Crashs에 지시하는 콜백을 노출합니다.

이렇게 하기로 선택했을 경우, 사용자의 확인을 받기 위해 다음 옵션 중 하나를 포함한 대화 상자 프롬프트를 통해 사용자의 승인을 받을 책임이 있습니다: 항상 전송, 전송, 전송하지 않음. 입력에 따라 App Center에 수행할 작업을 알려 주며 그에 따라 크래시가 처리됩니다.

비고

SDK는 이에 대한 대화 상자를 표시하지 않습니다. 앱은 사용자 동의를 요청하는 자체 UI를 제공해야 합니다.

비고

앱이 사용자 확인 대화 상자를 구현하지 않는 경우 명시적으로 호출 NotifyUserConfirmation 해서는 안 됩니다. 크래시 모듈은 로그 전송을 암시적으로 처리합니다.

다음 콜백은 충돌 보고를 전송하기 전에 사용자 확인을 기다리도록 SDK에 명령하는 방법을 보여 줍니다.

Crashes.ShouldAwaitUserConfirmation = () =>
{
    // Build your own UI to ask for user consent here. SDK doesn't provide one by default.

    // Return true if you built a UI for user consent and are waiting for user input on that custom UI, otherwise false.
    return true;
};

위의 콜백에서 true를 반환하는 경우, 당신의 코드를 사용하여 사용자 권한을 획득한 후, 그 결과를 다음 API를 사용하여 SDK에 전달해야 합니다.

// Depending on the user's choice, call Crashes.NotifyUserConfirmation() with the right value.
Crashes.NotifyUserConfirmation(UserConfirmation.DontSend);
Crashes.NotifyUserConfirmation(UserConfirmation.Send);
Crashes.NotifyUserConfirmation(UserConfirmation.AlwaysSend);

크래시 로그의 전송 상태에 대한 정보 가져오기

때때로 앱 크래시 상태를 알고 싶을 수 있습니다. 일반적인 사용 사례는 앱이 크래시 보고서를 제출하고 있음을 사용자에게 알리는 UI를 표시하거나, 앱이 출시 후 빠르게 충돌하는 경우 크래시 로그를 제출할 수 있도록 앱의 동작을 조정하려고 할 수 있습니다. App Center의 충돌 보고는 앱에서 무슨 일이 일어나고 있는지 알려주기 위해 사용할 수 있는 세 가지 콜백을 제공합니다.

다음 콜백은 SDK가 크래시 로그를 보내기 전에 호출됩니다.

Crashes.SendingErrorReport += (sender, e) =>
{
    // Your code, e.g. to present a custom UI.
};

엔드포인트에 네트워크 문제나 장애가 발생하여 앱을 SendingErrorReport 재시작하면, 프로세스가 다시 시작될 때 SendingErrorReport가 다시 트리거됩니다.

다음 콜백은 SDK가 크래시 로그를 성공적으로 보낸 후에 호출됩니다.

Crashes.SentErrorReport += (sender, e) =>
{
    // Your code, e.g. to hide the custom UI.
};

SDK에서 크래시 로그를 보내지 못한 경우 다음 콜백이 호출됩니다.

Crashes.FailedToSendErrorReport += (sender, e) =>
{
    // Your code goes here.
};

수신은 FailedToSendErrorReport4xx 코드와 같은 복구할 수 없는 오류가 발생했음을 의미합니다. 예를 들어 401 은 잘못된 것을 의미합니다 appSecret .

이 콜백은 네트워크 문제인 경우 트리거되지 않습니다. 이 경우 SDK는 계속 다시 시도하며 네트워크 연결이 중단되는 동안 다시 시도를 일시 중지합니다.

크래시 보고서에 첨부 파일 추가

크래시 보고서에 이진 및 텍스트 첨부 파일을 추가할 수 있습니다. SDK는 크래시와 함께 보내므로 App Center 포털에서 볼 수 있습니다. 다음 콜백은 이전 애플리케이션 시작에서 저장된 크래시 보내기 직전에 호출됩니다. 충돌이 발생하면 호출되지 않습니다. 해당 이름이 미니덤프 파일용으로 예약되어 있으므로 첨부 파일의 이름이 지정 minidump.dmp 확인합니다. 다음은 충돌 발생에 텍스트와 이미지를 연결하는 방법의 예입니다.

Crashes.GetErrorAttachments = (ErrorReport report) =>
{
    // Your code goes here.
    return new ErrorAttachmentLog[]
    {
        ErrorAttachmentLog.AttachmentWithText("Hello world!", "hello.txt"),
        ErrorAttachmentLog.AttachmentWithBinary(Encoding.UTF8.GetBytes("Fake image"), "fake_image.jpeg", "image/jpeg")
    };
};

비고

크기 제한은 현재 7MB입니다. 더 큰 첨부 파일을 보내려고 하면 오류가 트리거됩니다.

런타임에 App Center 충돌 사용 또는 사용 안 함

런타임에 App Center 크래시 기능을 사용하거나 사용하지 않도록 설정할 수 있습니다. 사용하지 않도록 설정하면 SDK에서 앱에 대한 크래시 보고를 수행하지 않습니다.

Crashes.SetEnabledAsync(false);

App Center Crashes를 다시 활성화하려면 동일한 API를 사용하되, 매개 변수로 true을(를) 전달합니다.

Crashes.SetEnabledAsync(true);

다른 API 호출(예: IsEnabledAsync와 같은)을 일관되게 만들기 위해 이 호출을 기다릴 필요가 없습니다.

상태는 애플리케이션 시작 시 디바이스의 스토리지에 유지됩니다.

App Center 크래시가 사용하도록 설정되어 있는지 확인

App Center Crashes가 사용 설정되어 있는지 여부를 확인할 수 있습니다.

bool isEnabled = await Crashes.IsEnabledAsync();

처리된 오류

App Center를 사용하면 처리된 예외를 사용하여 오류를 추적할 수도 있습니다. 이렇게 하려면 다음 메서드를 TrackError 사용합니다.

try {
    // your code goes here.
} catch (Exception exception) {
    Crashes.TrackError(exception);
}

앱은 필요에 따라 처리된 오류 보고서에 속성을 연결하여 추가 컨텍스트를 제공할 수 있습니다. 아래 예제와 같이 속성을 키/값 쌍의 사전(문자열에만 해당)으로 전달합니다.

try {
    // your code goes here.
} catch (Exception exception) {
    var properties = new Dictionary<string, string>
    {
        { "Category", "Music" },
        { "Wifi", "On"}
    };
    Crashes.TrackError(exception, properties); 
}

필요에 따라 처리된 오류 보고서에 이진 및 텍스트 첨부 파일을 추가할 수도 있습니다. 아래 예제와 같이 첨부 파일을 개체 배열 ErrorAttachmentLog 로 전달합니다.

try {
    // your code goes here.
} catch (Exception exception) {
    var attachments = new ErrorAttachmentLog[]
    {
        ErrorAttachmentLog.AttachmentWithText("Hello world!", "hello.txt"),
        ErrorAttachmentLog.AttachmentWithBinary(Encoding.UTF8.GetBytes("Fake image"), "fake_image.jpeg", "image/jpeg")
    };
    Crashes.TrackError(exception, attachments: attachments);
}