Aracılığıyla paylaş


App Center Kilitlenmeleri (Unity)

Önemli

Visual Studio App Center, 30 Haziran 2026'ya kadar desteklenmeye devam edecek Analiz ve Tanılama özellikleri dışında 31 Mart 2025'te kullanımdan kaldırılmıştır. Daha fazla bilgi edinin.

App Center Kilitlenmeleri, uygulamanız her kilitlendiğinde otomatik olarak bir kilitlenme günlüğü oluşturur ve bu günlüğü cihazın depolama alanında saklar. Kullanıcı uygulamayı yeniden başlattığında, SDK kilitlenme raporunu App Center'a gönderir. Kilitlenmeleri toplama işlemi, hem beta hem de canlı uygulamalar için, yani Google Play'e gönderilen kilitlenmeler için geçerlidir. Çökme günlükleri, çökme sorununu çözmenize yardımcı olacak değerli bilgiler içerir.

Uygulamanızda SDK'yı henüz ayarlamadıysanız Unity Başlarken bölümündeki yönergeleri izleyin.

iOS'taki çökme günlükleri sembolleştirmeyi gerektirir. Simgeselleştirmeyi etkinleştirmek için, uygulamanız için sembolleri sağlamayı açıklayan App Center Tanılama belgelerine bakın.

Önemli

Unity için Çökmeler SDK'sı UWP'yi desteklemez. Bu sayfadaki yönergeler yalnızca Android ve iOS'ı kapsar.

Uyarı

Hata ayıklayıcıyı bağladıysanız SDK herhangi bir kilitlenme günlüğünü iletmeyecektir. Uygulamayı kilitlediğinizde hata ayıklayıcının bağlı olmadığından emin olun.

Uyarı

Enable CrashReport API etkin durumdaysa, PlayerSettings altında SDK kilitlenme günlüklerini toplamaz.

Test kilitlenmesi oluştur

App Center Kilitlenmeleri, SDK'nın kolay test edilmesi için bir test kilitlenmesi oluşturmanızı sağlayan 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();

Uyarı

Bu yöntem yalnızca Geliştirme Derlemesi ayarı açıkken çalışır.

Önceki kilitlenme hakkında daha fazla bilgi edinin

App Center Çökmesi, uygulamanızın çökmesi durumunda size daha fazla bilgi sağlayan iki API'si bulundurur.

Uygulama önceki oturumda düşük bellek uyarısı mı aldı?

SDK'yı başlattıktan sonra herhangi bir zamanda uygulamanın önceki oturumda bir bellek uyarısı almış olup olmadığını kontrol edebilirsiniz:

bool hadLowMemoryWarning = Crashes.HasReceivedMemoryWarningInLastSessionAsync().Result;

Uyarı

Bu yöntem içinde Awake()çalışmaz.

Uyarı

Bazı durumlarda, belleği düşük olan bir cihaz olayları gönderemez.

Uygulama önceki oturumda kilitleniyor muydu?

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

bool didAppCrash = await Crashes.HasCrashedInLastSessionAsync();

Uygulamanız bir kilitlenme yaşadıktan sonra, davranışını veya kullanıcı arayüzünü ayarlamak istiyorsanız HasCrashedInLastSessionAsync çağırmak yararlıdır. Bazı geliştiriciler, kullanıcılarından özür dilemek amacıyla ek bir kullanıcı arabirimi gösterir veya bir kilitlenme meydana geldikten sonra iletişim kurmak ister.

Son çökme ile ilgili ayrıntılar

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

ErrorReport crashReport = await Crashes.GetLastSessionCrashReportAsync();

Bu API'nin en yaygın kullanım durumu, bir kullanıcının kendi özelleştirilmiş Kilitlenme temsilcisi veya dinleyicisini uyguladığı durumlardır.

App Center Kilitlenmelerinin kullanımını özelleştirin

App Center Kilitlenmeleri, geliştiricilere App Center'a çökme kayıtları göndermeden önce ve gönderdikleri sırada ek eylemler gerçekleştirebilmesi için geri çağrılar sağlar.

Uyarı

App Center başlamadan önce geri çağırmayı ayarlayın, örneğin Awake yöntemi içinde, çünkü App Center başlangıçtan hemen sonra kilitlenmeleri işlemeye başlar.

Kilitlenme işlenmeli mi?

Belirli bir kilitlenmenin işlenip işlenmemesi gerektiğine karar vermek istiyorsanız aşağıdaki geri çağrıyı ayarlayın. Örneğin, yoksaymak ve App Center'a göndermemek istediğiniz sistem seviyesinde bir çökme 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 Çökmeler modülüne herhangi bir çökme raporu göndermeden önce kullanıcı onayını beklemesini belirten bir geri çağırım sağlar.

Kodunuz bu geri çağırmayı kullanıyorsa, kullanıcının onayını almak sizin sorumluluğunuzdadır. Seçeneklerden biri, aşağıdaki seçeneklerden birini içeren bir iletişim kutusu istemidir: Her Zaman Gönder, Gönder ve Gönderme. Girdiye göre, App Center Crashes'a ne yapması gerektiğini bildireceksiniz ve ardından kilitlenme uygun şekilde işlenecektir.

Uyarı

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.

Aşağıdaki geri çağırma işlevi, SDK'ya kilitlenmeleri göndermeden önce kullanıcı onayını beklemesi için nasıl talimat vereceğ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;
};

Geri çağırma döndürürse true, kullanıcı iznini almanız ve aşağıdaki API'yi kullanarak sonucu SDK'ya iletmeniz gerekir:

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

Örnek olarak özel iletişim kutusu örneğimize başvurabilirsiniz.

Kilitlenme günlüğü için gönderim durumu hakkında bilgi edinme

Bazen uygulamanızın çökme durumunu bilmek istersiniz. Yaygın bir kullanım örneği, kullanıcıya uygulamanın kilitlenme raporu gönderdiğini bildiren bir kullanıcı arabirimi görüntülemektir. Başka bir senaryo, kilitlenme günlüklerinin yeniden başlatıldıktan kısa süre sonra gönderildiğinden emin olmak için uygulamanın davranışını ayarlamak istemenizdir. App Center Çökme Olayları, neler olduğuna dair bildirimler almak için yapabileceğiniz üç farklı geri bildirim işlevi sağlar.

Aşağıdaki geri arama, SDK bir kilitlenme günlüğü göndermeden önce çağrılacaktır.

Crashes.SendingErrorReport += (errorReport) =>
{
    // 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 bir kilitlenme günlüğünü başarıyla gönderdikten sonra aşağıdaki geri arama tetiklenir

Crashes.SentErrorReport += (errorReport) =>
{
    // 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 += (errorReport, exception) =>
{
    // Your code goes here.
};

Almak 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 çağırma bir ağ sorunu olduğunda tetiklenmez. Bu durumda SDK yeniden denemeye devam eder (ve ayrıca ağ bağlantısı kapatılırken yeniden denemeleri duraklatır).

Çökme veya işlenmeyen özel durum raporuna ek dosyalar ekleme

Kilitlenme veya işlenmeyen özel durum raporuna isteğe bağlı olarak ikili ve metin ekleri de ekleyebilirsiniz. SDK, bunları App Center portalında görebilmeniz için raporla birlikte gönderir. Depolanan raporu göndermeden önce aşağıdaki callback çağrılır. Uygulamanın çökmesi durumunda, bir sonraki başlatmada gerçekleşir. İşlenmeyen özel durumlar için ekleri göndermeyi kabul etmeniz gerekir. Ek dosyasının, minidump dosyaları için ayrılmış bir ad olduğundan adlandırılmadığındanminidump.dmp emin olun. Bir rapora metin ve resim ekleme örneği aşağıda 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")
    };
};

Raporlarda IsCrash özelliğine sahip çökme durumları, işlenmeyen özel durumlardan ayırt edilir. Özellik, kilitlenmeler için true olarak ayarlanır ve aksi takdirde false olur.

Uyarı

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

Uyarı

GetErrorAttachments ana iş parçacığında çağrılır ve çalışmayı çerçeveler arasında bölmez. Oyun döngüsünün engellenmesini önlemek için bu geri çağırmada uzun süren görevler gerçekleştirmeyin.

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

Çalışma zamanında App Center Crashes özelliğini etkinleştirebilir ve devre dışı bırakabilirsiniz. Devre dışı bırakırsanız SDK, uygulama için herhangi bir kilitlenme bildirimi gerçekleştirmez.

Crashes.SetEnabledAsync(false);

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

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ı olur.

App Center Çökme Raporlarının etkinleştirilip etkinleştirilmediğini kontrol edin

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

bool isEnabled = await Crashes.IsEnabledAsync();

Unity'de Handle Edilen Özel Durumlar

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

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

Hatanız hakkında daha fazla bağlam için, hatanıza özellikler ekleyebilirsiniz. Özellikleri bir dize sözlüğü olarak geçirin. Bu adım isteğe bağlıdır.

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

İsteğe bağlı olarak, işlenen bir 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);
}

Unity'de İşlenmeyen Özel Durumlar

İşlenmeyen özel durumları bildirme

App Center SDK'sı varsayılan olarak, uygulamanızda ölümcül bir çökme ile sonuçlanmayan işlenmeyen özel durumları bildirmez. Bu işlevi etkinleştirmek için aşağıdaki yöntemi çağırın:

Crashes.ReportUnhandledExceptions(true);

Bu API'yi çağırdıktan sonra, App Center daha önce bahsedilen işlenen özel durumlara benzer şekilde, işlenmeyen tüm özel durumları App Center portalında Sorunlar olarak günlüğe kaydeder. Bu işlevi devre dışı bırakmak için parametre olarak false geçirerek aynı API'yi çağırın.

Crashes.ReportUnhandledExceptions(false);

Uyarı

App Center SDK'sı tarafından algılanan bazı işlenmeyen özel durumlar App Center kullanıcı arabiriminde hata olarak görünür. Bunun nedeni, Unity'nin varsayılan olarak işlenmeyen özel durumları yakalaması ve bu sırada uygulamanın sonlandırılmaması, dolayısıyla kilitlenme olarak kabul edilmemesidir.

İşlenmeyen özel durum raporuna ek ekleme

App Center SDK'sı varsayılan olarak işlenmeyen özel durumlarda ekleri etkinleştirmez. Bu işlevi etkinleştirmek için yönteminin enableAttachmentsCallback boole parametresini ReportUnhandledExceptions olarak trueayarlayın:

Crashes.ReportUnhandledExceptions(true, true);

Ardından, GetErrorAttachments geri çağırmasını uygulayarak isteğe bağlı olarak işlenmeyen bir özel durum raporuna ekler ekleyebilirsiniz.

NDK kilitlenmelerini raporlama

Çökme raporlama

App Center'da düzgün kilitlenme raporları almak için önce yukarıda listelenen yönergeleri izleyerek App Center Crashes SDK'sının ayarlandığından emin olun.

Breakpad kütüphanesini oluşturma

Ardından, Resmi Android IÇIN Google Breakpad README'de listelenen yönergeleri izleyerek Google Breakpad'i eklemeniz ve derlemeniz gerekir. Unity'de kullanmak için ikili dosyasını uygulamanızla birlikte ekleyin.

Uyarı

App Center SDK'sı, Google Breakpad'i varsayılan olarak paketlemez.

Özel durum işleyicisini ekleme

Google Breakpad'i ekledikten sonra NDK Kilitlenme İşleyicisi'ni ekleyin:

/* Attach NDK Crash Handler. */
var minidumpDir = Crashes.GetMinidumpDirectoryAsync();
setupNativeCrashesListener(minidumpDir.Result);

...

[DllImport("YourLib")]
private static extern void setupNativeCrashesListener(string path);

yöntemi setupNativeCrashesListener , C/C++'da uygulamanız gereken yerel bir yöntemdir:

#include <android/log.h>
#include "google-breakpad/src/client/linux/handler/exception_handler.h"
#include "google-breakpad/src/client/linux/handler/minidump_descriptor.h"

static google_breakpad::ExceptionHandler exception_handler(google_breakpad::MinidumpDescriptor(), NULL, dumpCallback, NULL, true, -1);

/**
 * Registers breakpad as the exception handler for NDK code.
 * @param path minidump directory path returned from Crashes.GetMinidumpDirectoryAsync()
 */
extern "C" void setupNativeCrashesListener(const char *path) {
    google_breakpad::MinidumpDescriptor descriptor(path);
    exception_handler.set_minidump_descriptor(descriptor);
}

dumpCallback Sorun giderme için nerede kullanılır:

/*
 * Triggered automatically after an attempt to write a minidump file to the breakpad folder.
 */
static bool dumpCallback(const google_breakpad::MinidumpDescriptor &descriptor,
                         void *context,
                         bool succeeded) {

    /* Allow system to log the native stack trace. */
    __android_log_print(ANDROID_LOG_INFO, "YourLogTag",
                        "Wrote breakpad minidump at %s succeeded=%d\n", descriptor.path(),
                        succeeded);
    return false;
}

Bu yöntemler düzgün bir şekilde ayarlandıktan sonra, uygulama yeniden başlatıldıktan sonra minidump'ı App Center'a otomatik olarak gönderir. Sorun gidermek için ayrıntılı günlükleri kullanarak uygulama yeniden başlatıldıktan sonra minidump'ların gönderilip gönderilmediğini kontrol edebilirsiniz.

Uyarı

App Center, minidump ekleri için ayrılmış adı minidump.dmp kullanır. Düzgün bir şekilde işleyebilmemiz için minidump dosyası olmadığı sürece ekinize farklı bir ad verdiğinizden emin olun.

Uyarı

Breakpad'de, x86 öykünücülerinde kilitlenmeleri yakalamayı imkansız hale getiren bilinen bir hata vardır.

Simgeselleştirme

Çökmelerin işlenmesiyle ilgili daha fazla bilgi için Tanı belgelerine bakın.