App Center Kilitleniyor (Windows)

Önemli

Visual Studio App Center 31 Mart 2025'te kullanımdan kaldırılıyor. Tamamen kullanımdan kaldırılana kadar Visual Studio App Center'ı kullanmaya devam edebilirsiniz ancak geçiş yapmayı düşünebileceğiniz birkaç önerilen alternatif vardır.

Destek zaman çizelgeleri ve alternatifleri hakkında daha fazla bilgi edinin.

App Center Kilitlenmeleri, uygulamanız her kilitlenişinde otomatik olarak bir kilitlenme günlüğü oluşturur. Günlük ilk olarak cihazın depolama alanına yazılır ve kullanıcı uygulamayı yeniden başlattığında kilitlenme raporu App Center'a gönderilir.

App Center SDK'sı yalnızca işlenmeyen .NET özel durumlarının neden olduğu kilitlenmeleri toplar. C veya C++ kullanırken yerel kilitlenmeleri toplamaz. Ancak, C++ kilitlenmeleri olan bir uygulamanız varsa, bunları karşıya yükleme kilitlenmeleri API'si aracılığıyla App Center'a yükleyebilirsiniz.

Uygulamanızda SDK'yı henüz ayarlamadıysanız WPF/WinForms Başlarken'i izleyin.

WinForms uygulamalarında işlenmeyen özel durumlar

Not

Bu bölüm ve aşağıdaki alt bölümler yalnızca WinForms için geçerlidir. SDK'yı WPF ile tümleştiriyorsanız bu bölümü atlayabilirsiniz.

Varsayılan olarak, WinForms uygulamasında işlenmeyen bir özel durum hata ayıklayıcı bağlı değilse kilitlenmeyi tetiklemez (uygulamadan çıkılmaz).

Bunun yerine, Windows kullanıcıya uygulama yürütmeye devam etme veya uygulamadan çıkma seçeneğini gösteren bir iletişim kutusu gösterir. Sonuç olarak, App Center SDK'sı bu özel durumları otomatik olarak yakalayamaz (kullanıcı Çık düğmesine tıklasa bile).

Kilitlenmeler App Center'da yalnızca uygulamanın otomatik olarak çıkması durumunda toplanır. App Center oturum başına yalnızca bir kilitlenmeyi destekler.

WinForms'ta işlenmeyen özel durumları raporlamanın iki yolu vardır. Uygulama, işlenmeyen özel durumlarda kilitlenmek üzere yapılandırılabilir veya çalışmaya devam edebilir ancak işlenmeyen özel durumları çalışma zamanı hataları olarak bildirebilir.

Uygulamayı kilitlenmede çıkmak için yapılandırma

İşlenmeyen özel durumu App Center'da kilitlenme olarak raporlamanın tek yolu budur ve işlenmeyen özel durumlarda uygulamadan çıkılır.

Bunu yapmak için SDK'yı başlatmadan önce bir Windows yöntemi çağırın:

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

Bu seçenek uygulamanızda kabul edilebilir değilse, işlenmeyen özel durumu çalışma zamanı hatası olarak bildirebilirsiniz (aşağıda açıklanmıştır).

İşlenmeyen özel durumu çalışma zamanı hatası olarak bildirme

Uygulamanızın işlenmeyen bir özel durumdan sonra çalışmaya devam etmesi gerekiyorsa, özel durumu App Center'da kilitlenme olarak bildiremezsiniz, ancak bunun yerine hata olarak bildirebilirsiniz.

Bunu yapmak için aşağıdaki kod örneğini kullanabilirsiniz:

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

Not

Hata ayıklayıcısı eklendiğinde, işlenmeyen özel durumlar uygulamasına bir işleyici eklenmediği sürece uygulamanın çıkışına (kilitlenmelerine Application.ThreadException) neden olur.

Test kilitlenmesi oluşturma

App Center Kilitlenmeleri, SDK'nın kolay testine yönelik bir test kilitlenmesi oluşturmak için size bir API sağlar. Bu API hata ayıklama ve sürüm yapılandırmalarını denetler. Bu nedenle, yalnızca hata ayıklarken kullanabilirsiniz çünkü sürüm uygulamalarında çalışmaz.

Crashes.GenerateTestCrash();

Önceki kilitlenme hakkında daha fazla bilgi edinin

App Center Kilitlenmeleri, uygulamanızın kilitlenmesi durumunda size daha fazla bilgi veren iki API'ye sahiptir.

Uygulama önceki oturumda kilitleniyor mu?

SDK'yı başlattıktan sonra uygulamanın önceki başlatmada kilitlenip kilitlenmediğini kontrol edebilirsiniz:

bool didAppCrash = await Crashes.HasCrashedInLastSessionAsync();

Bu, kilitlenme gerçekleştikten sonra uygulamanızın davranışını veya kullanıcı arabirimini ayarlamak istemeniz durumunda kullanışlıdır. Bazı geliştiriciler, kullanıcılarından özür dilemek için ek kullanıcı arabirimi göstermeyi veya kilitlenme gerçekleştikten sonra iletişim kurmanın bir yolunu tercih eder.

Not

Bu yöntem yalnızca başlatıldıktan sonra Crashes kullanılmalıdır, her zaman başlamadan önce döndürülecektir false .

Son kilitlenmeyle ilgili ayrıntılar

Uygulamanız daha önce kilitlendiyse son kilitlenmeyle ilgili ayrıntıları alabilirsiniz.

ErrorReport crashReport = await Crashes.GetLastSessionCrashReportAsync();

Not

Bu yöntem yalnızca başlatıldıktan sonra Crashes kullanılmalıdır, her zaman başlamadan önce döndürülecektir null .

Bu API için çok sayıda kullanım örneği vardır. En yaygın olanı, bu API'yi çağıran ve özel Crashes temsilcisini veya dinleyicisini uygulayan kişilerdir.

App Center Kilitlenmeleri kullanımınızı özelleştirme

App Center Kilitlenmeleri, geliştiricilerin App Center'a kilitlenme günlükleri göndermeden önce ve gönderirken ek eylemler gerçekleştirmesi için geri çağırmalar sağlar.

Not

App Center başlangıçtan hemen sonra kilitlenmeleri işlemeye başladığından, çağrısındanAppCenter.Start()önce geri aramayı ayarlayın.

Kilitlenme işlenmeli mi?

Belirli bir kilitlenmenin işlenmesi gerekip gerekmediğine karar vermek istiyorsanız bu geri aramayı ayarlayın. Örneğin, yoksaymak istediğiniz ve App Center'a göndermek istemediğiniz bir sistem düzeyinde kilitlenme olabilir.

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

Kullanıcı gizliliği sizin için önemliyse, App Center'a kilitlenme raporu göndermeden önce kullanıcı onayı almak isteyebilirsiniz. SDK, App Center Kilitlenmeleri'ne kilitlenme raporlarını göndermeden önce kullanıcı onayını beklemesini bildiren bir geri arama sunar.

Bunu yapmayı seçerseniz, kullanıcının onayını almak sizin sorumluluğundadır; örneğin, aşağıdaki seçeneklerden birini içeren bir iletişim kutusu istemi aracılığıyla: Her Zaman Gönder, Gönder ve Gönderme. Girişe bağlı olarak, App Center Kilitlenmesi'ne ne yapması gerektiğini söyleyeceksiniz ve kilitlenme buna göre işlenir.

Not

SDK bunun için bir iletişim kutusu görüntülemez, uygulamanın kullanıcı onayı istemek için kendi kullanıcı arabirimini sağlaması gerekir.

Not

Uygulama bir kullanıcı onayı iletişim kutusu uygulamazsa açıkça çağrı NotifyUserConfirmation yapmamalıdır; Crashes modülü sizin için günlükleri gönderme işlemini örtük olarak işler.

Aşağıdaki geri arama, SDK'ya kilitlenmeleri göndermeden önce kullanıcı onayını beklemesini nasıl söyleyeceğinizi gösterir:

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;
};

Yukarıdaki geri çağırmada geri dönmeniz true durumunda, uygulamanız kullanıcı iznini almalı (kendi kodunuzu kullanarak) ve aşağıdaki API'yi kullanarak sonucu SDK'ya göndermelidir.

// 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);

Kilitlenme günlüğünün gönderme durumu hakkında bilgi alma

Bazen uygulamanızın kilitlenme durumunu bilmek istersiniz. Sık karşılaşılan bir kullanım örneği, kullanıcılara uygulamanızın kilitlenme raporu gönderdiğini bildiren kullanıcı arabirimini göstermek veya uygulamanızın başlatma sonrasında hızla kilitlenmesi durumunda kilitlenme günlüklerinin gönderildiğinden emin olmak için uygulamanın davranışını ayarlamak istemenizdir. App Center Kilitlenmeleri, neler olduğu hakkında bildirim almak için uygulamanızda kullanabileceğiniz üç farklı geri arama sağlar:

SDK bir kilitlenme günlüğü göndermeden önce aşağıdaki geri arama çağrılır

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

Uç noktada ağ sorunları veya kesinti olması ve uygulamayı yeniden başlatmanız durumunda işlem SendingErrorReport yeniden başlatıldıktan sonra yeniden tetikleniyor.

SDK başarılı bir şekilde bir kilitlenme günlüğü gönderdikten sonra aşağıdaki geri arama çağrılır

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

SDK bir kilitlenme günlüğü gönderemezse aşağıdaki geri arama çağrılır

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

Alma FailedToSendErrorReport , 4xx kodu gibi kurtarılamaz bir hata oluştuğu anlamına gelir. Örneğin, 401 yanlış olduğu anlamına gelir appSecret .

Bu geri arama bir ağ sorunuysa tetiklenmemiştir. Bu durumda SDK yeniden denemeye devam eder (ve ağ bağlantısı kapalıyken yeniden denemeleri duraklatır).

Kilitlenme raporuna ek ekleme

Kilitlenme raporuna ikili ve metin ekleri ekleyebilirsiniz. SDK bunları kilitlenmeyle birlikte gönderir, böylece bunları App Center portalında görebilirsiniz. Önceki uygulama başlatmalarından depolanan kilitlenme gönderilmeden hemen önce aşağıdaki geri arama çağrılır. Kilitlenme gerçekleştiğinde çağrılmayacak. Minidump dosyaları için ayrılmış bir ad olduğundan ek dosyasının adlandırılmadığındanminidump.dmp emin olun. Aşağıda kilitlenmeye metin ve resim ekleme örneği verilmiştir:

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")
    };
};

Not

Boyut sınırı şu anda 7 MB'tır. Daha büyük bir ek göndermeye çalışmak bir hatayı tetikler.

Çalışma zamanında App Center Kilitlenmelerini etkinleştirme veya devre dışı bırakma

Çalışma zamanında App Center Kilitlenmelerini etkinleştirebilir ve devre dışı bırakabilirsiniz. Devre dışı bırakırsanız SDK, uygulama için kilitlenme bildirimi yapmaz.

Crashes.SetEnabledAsync(false);

App Center Kilitlenmelerini yeniden etkinleştirmek için aynı API'yi kullanın ancak parametre olarak geçirin true .

Crashes.SetEnabledAsync(true);

Diğer API çağrılarını (örneğin IsEnabledAsync) tutarlı hale getirmek için bu çağrıyı beklemeniz gerekmez.

Durum, uygulama başlatmaları arasında cihazın depolama alanında kalıcı hale geldi.

App Center Kilitlenmelerinin etkinleştirilip etkinleştirilmediğini denetleyin

App Center Kilitlenmelerinin etkinleştirilip etkinleştirilmediğini de de de kontrol edebilirsiniz:

bool isEnabled = await Crashes.IsEnabledAsync();

İşlenen Hatalar

App Center, işlenen özel durumları kullanarak hataları izlemenize de olanak tanır. Bunu yapmak için yöntemini kullanın TrackError :

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

Bir uygulama isteğe bağlı olarak daha fazla bağlam sağlamak için işlenen bir hata raporuna özellikler ekleyebilir. Özellikleri, aşağıdaki örnekte gösterildiği gibi anahtar/değer çiftlerinin (yalnızca dizeler) sözlüğü olarak geçirin.

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

İsterseniz işlenen hata raporuna ikili ve metin ekleri de ekleyebilirsiniz. Aşağıdaki örnekte gösterildiği gibi ekleri bir nesne dizisi ErrorAttachmentLog olarak geçirin.

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);
}