Przekazywanie awarii za pośrednictwem interfejsu API
Ważne
Program Visual Studio App Center ma zostać wycofany 31 marca 2025 r. Mimo że możesz nadal używać programu Visual Studio App Center do momentu jej pełnego wycofania, istnieje kilka zalecanych alternatyw, do których można rozważyć migrację.
Dowiedz się więcej o osiach czasu pomocy technicznej i alternatywach.
Możesz przekazać raport o awarii, jeśli nie chcesz używać naszego zestawu SDK ani opracowywać dla niestandardowej platformy. Przekaż awarię, błąd lub dziennik załącznika do centrum aplikacji i wyświetl szczegóły w interfejsie użytkownika diagnostyki centrum aplikacji. W poniższych sekcjach opisano sposób przekazywania awarii, błędów i załączników.
Uwaga
Centrum aplikacji akceptuje maksymalnie 60 awarii i obsługuje błędy na minutę na unikatową aplikację. Nie pozyskujemy żadnych awarii ani błędów, które przekraczają ten limit.
Aby przekazać raport, wywołaj punkt końcowy pozyskiwania centrum aplikacji pod https://in.appcenter.ms/logs?Api-Version=1.0.0
adresem z następującymi nagłówkami:
-
Content-Type
: opisuje format treści. Centrum aplikacji obecnie obsługuje tylko format JSON. -
App-Secret
: ciąg, który jest unikatowym identyfikatorem każdej aplikacji. Wpis tajny aplikacji można znaleźć w ustawieniach aplikacji. -
Install-ID
: ciąg, który może być dowolnym identyfikatorem GUID używanym do śledzenia liczby.
Właściwości dziennika:
-
type
: wymagany ciąg z typem dziennika — "appleError" dla awarii firmy Apple, "managedError" dla innych awarii, "handledError" dla błędów i "errorAttachment" dla załączników błędów. -
timestamp
: opcjonalny ciąg z sygnaturą czasową dziennika data/godzina, np. "2017-03-13T18:05:42Z" — jeśli jest ustawiony, musi być co najwyżej 72 godziny w przyszłości pozyskiwania -
appLaunchTimestamp
: wymagany ciąg określający godzinę rozpoczęcia pracy aplikacji, na przykład "2017-03-13T18:05:42Z". -
device
: wymagany obiekt z cechami urządzenia-
appVersion
: wymagany ciąg o nazwie wersji aplikacji, na przykład "1.1.0" -
appBuild
: wymagany ciąg z numerem kompilacji aplikacji, na przykład "42" -
sdkName
: wymagany ciąg o nazwie zestawu SDK. Składa się z nazwy zestawu SDK i platformy, na przykład "appcenter.android" dla systemu Android i "appcenter.custom" dla platform niestandardowych -
sdkVersion
: wymagany ciąg z wersją zestawu SDK w formacie semantycznego przechowywania wersji, na przykład "1.2.0" lub "0.12.3-alfa.1" -
osName
: wymagany ciąg o nazwie systemu operacyjnego, na przykład "android" -
osVersion
: wymagany ciąg z wersją systemu operacyjnego, na przykład "9.3.0" -
model
: opcjonalny ciąg z modelem urządzenia, na przykład "iPad2" -
locale
: wymagany ciąg z kodem języka, na przykład "en-US" -
timeZoneOffset
: opcjonalne przesunięcie w minutach (od -840 do 840) z uniwersalnego czasu koordynowanego (UTC) dla strefy czasowej urządzenia. W tym czas letni, na przykład 120.
-
-
userId
: opcjonalny ciąg używany do kojarzenia dzienników z użytkownikami -
exception
: wymagany obiekt ze szczegółami wyjątku-
type
: wymagany ciąg z typem wyjątku -
frame
: opcjonalna tablica z ramkami stosu -
message
: opcjonalny ciąg z przyczyną wyjątku -
stackTrace
: opcjonalny ciąg z nieprzetworzonym śladem stosu -
innerException
: opcjonalna tablica z wyjątkami wewnętrznymi
-
Przykłady przekazywania raportu o awarii, raportu o błędach i załącznika można znaleźć poniżej. Aby uzyskać więcej specyfikacji, możesz znaleźć pełny plik tutaj.
Uwaga
Ze względu na zasady przechowywania raport timestamp
nie może przekraczać 25 dni w ciągu ostatnich lub 3 dni w przyszłości.
Przekazywanie raportu o awarii
Do przekazania raportu o awarii wymagane są następujące właściwości:
-
processId
: wymagana liczba całkowita z identyfikatorem procesu -
id
: wymagany ciąg z identyfikatorem wyjątku, musi być unikatowym identyfikatorem dla tego raportu -
fatal
: wymagany wartość logiczna wskazująca, czy wyjątek spowodował awarię -
processName
: wymagany ciąg o nazwie procesu -
appNamespace
: wymagane dla aplikacji systemu Android, w przeciwnym razie opcjonalny ciąg z identyfikatorem pakietu, identyfikatorem pakietu lub przestrzenią nazw, w zależności od używanej platformy.
Aby przekazać raport awarii inny niż format firmy Apple, upewnij się, że typ dziennika jest ustawiony na wartość "managedError".
curl -X POST \
'https://in.appcenter.ms/logs?Api-Version=1.0.0' \
-H 'Content-Type: application/json' \
-H 'app-secret: <app secret>' \
-H 'install-id: 00000000-0000-0000-0000-000000000001' \
-d '{
"logs": [
{
"type": "managedError",
"timestamp": "2019-10-08T04:22:23.516Z",
"appLaunchTimestamp": "2019-09-29T22:22:23.516Z",
"processId": "123",
"id": "bca65f46-46ee-451b-83bb-2e358c3f45bf",
"fatal": true,
"processName": "com.microsoft.appcenter.demo.project",
"device": {
"appVersion": "12.0",
"appBuild": "1",
"sdkName": "custom.android",
"sdkVersion": "1.0.0",
"osName": "android",
"osVersion": "9.3",
"model": "Pixel",
"locale": "en-US",
"appNamespace": "com.contoso.myapp"
},
"userId": "TestID",
"exception": {
"type": "java.lang.RuntimeException",
"frames": [
{
"className": "android.app.ActivityThread",
"fileName": "ActivityThread.java",
"lineNumber": 2575,
"methodName": "performResumeActivity"
},
{
"className": "android.app.ActivityThread",
"fileName": "ActivityThread.java",
"lineNumber": 2603,
"methodName": "handleResumeActivity"
},
{
"className": "android.app.ActivityThread",
"fileName": "ActivityThread.java",
"lineNumber": 2089,
"methodName": "handleLaunchActivity"
},
{
"className": "android.app.ActivityThread",
"fileName": "ActivityThread.java",
"lineNumber": 130,
"methodName": "access$600"
},
{
"className": "android.app.ActivityThread$H",
"fileName": "ActivityThread.java",
"lineNumber": 1195,
"methodName": "handleMessage"
},
{
"className": "android.os.Handler",
"fileName": "Handler.java",
"lineNumber": 99,
"methodName": "dispatchMessage"
},
{
"className": "android.os.Looper",
"fileName": "Looper.java",
"lineNumber": 137,
"methodName": "loop"
},
{
"className": "android.app.ActivityThread",
"fileName": "ActivityThread.java",
"lineNumber": 4745,
"methodName": "main"
}
],
"innerExceptions": [
{
"type": "java.lang.RuntimeException",
"frames": [
{
"className": "android.app.Activity",
"fileName": "Activity.java",
"lineNumber": 5084,
"methodName": "performResume"
},
{
"className": "android.app.ActivityThread",
"fileName": "ActivityThread.java",
"lineNumber": 2565,
"methodName": "performResumeActivity"
},
{
"className": "android.app.ActivityThread",
"fileName": "ActivityThread.java",
"lineNumber": 2603,
"methodName": "handleResumeActivity"
}
]
}
]
}
}
]
}'
Przekazywanie dziennika awarii firmy Apple
Aby przekazać dziennik awarii firmy Apple, upewnij się, że typ dziennika jest ustawiony na wartość "appleError". Wymagane są również następujące właściwości:
-
primaryArchitectureId
: wymagana liczba całkowita z podstawową architekturą procesora CPU -
applicationPath
: wymagany ciąg ze ścieżką do aplikacji -
osExceptionType
: wymagany ciąg z typem wyjątku systemu operacyjnego -
osExceptionCode
: wymagany ciąg z kodem wyjątku systemu operacyjnego -
osExceptionAddress
: wymagany ciąg z adresem wyjątku systemu operacyjnego -
binaries
: wymagana tablica z danymi binarnymi skojarzonymi z błędem
Na przykład:
curl -X POST \
'https://in.appcenter.ms/logs?Api-Version=1.0.0' \
-H 'Content-Type: application/json' \
-H 'app-secret: <app secret>' \
-H 'install-id: 00000000-0000-0000-0000-000000000001' \
-d '{
"logs":
[
{
"type": "appleError",
"timestamp": "2019-10-08T02:44:55.000Z",
"appLaunchTimestamp": "2019-09-29T22:22:23.516Z",
"id": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
"applicationPath": "iOS/salesforce",
"osExceptionType": "CustomerIssue (TestIssue)",
"osExceptionCode": "0",
"osExceptionAddress": "0x00",
"processName": "salesforce",
"fatal": true,
"isTestMessage": false,
"device": {
"appVersion": "10.0",
"appBuild": "1",
"sdkName": "custom.ios",
"sdkVersion": "1.0.0",
"osName": "iOS",
"osVersion": "9.3",
"model": "iPhone9,1",
"locale": "en-US"
},
"userId": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
"fatal": true,
"threads": [
{
"id": 0,
"frames": [
{
"address": "0x000000018ada4d70",
"code": "0x18ad87000 + 122224"
},
{
"address": "0x0000000104463884",
"code": "0x10445c000 + 30852"
},
{
"address": "0x000000010438f640",
"code": "0x104388000 + 30272"
},
{
"address": "0x00000001b859fb64",
"code": "0x1b8229000 + 3631972"
}
]
},
{
"id": 1,
"frames": [
{
"address": "0x000000018bb4fce0",
"code": "0x18baa2000 + 711904"
},
{
"address": "0x000000018bbf7078",
"code": "0x18baa2000 + 1396856"
},
{
"address": "0x000000018baa8258",
"code": "0x18baa2000 + 25176"
},
{
"address": "0x000000018bb1c49c",
"code": "0x18baa2000 + 500892"
}
]
},
{
"id": 3,
"frames": [
{
"address": "0x000000018b755b9c",
"code": "0x18b732000 + 146332"
},
{
"address": "0x000000018b7dcd00",
"code": "0x18b7ce000 + 60672"
}
]
}
],
"binaries": [
{
"id": "d449e33d-7e74-379d-8b79-15ee104ed1df",
"startAddress": "0x0000000104388000",
"endAddress": "0x0000000104413fff",
"name": "CrashProbeiOS",
"path": "/var/containers/Bundle/Application/023013EA-0D58-4F6D-8B98-49E1372F4044/CrashProbeiOS.app/CrashProbeiOS",
"primaryArchitectureId": 16777228,
"architectureVariantId": 0
},
{
"id": "5da23653-d126-39f0-bdcf-994b3019f92c",
"startAddress": "0x000000010445c000",
"endAddress": "0x0000000104467fff",
"name": "CrashLibiOS",
"path": "/private/var/containers/Bundle/Application/023013EA-0D58-4F6D-8B98-49E1372F4044/CrashProbeiOS.app/Frameworks/CrashLibiOS.framework/CrashLibiOS",
"primaryArchitectureId": 16777228,
"architectureVariantId": 0
}
]
}
]
}'
Przekazywanie niestandardowego dziennika awarii
Aby przekazać awarię dla niestandardowej platformy, upewnij się, że typ dziennika jest ustawiony na wartość "managedError", a wartość sdkName jest ustawiona na "appcenter.custom". Na przykład:
curl -X POST \
'https://in.appcenter.ms/logs?Api-Version=1.0.0' \
-H 'Content-Type: application/json' \
-H 'app-secret: <app secret>' \
-H 'install-id: 00000000-0000-0000-0000-000000000001' \
-d '{
"logs": [
{
"type": "managedError",
"id": "a7bea41b-1e4d-4e42-ae76-1025f4fdfc4f",
"userId": "TestID",
"timestamp": "2019-11-26T02:00:04Z",
"appLaunchTimestamp": "2019-11-26T02:00:04Z",
"architecture": "armeabi-v7a",
"fatal": true,
"processId": 4871,
"processName": "com.microsoft.appcenter.sasquatch.project",
"sid": "bca65f46-46ee-451b-83bb-2e358c3f45bf",
"errorThreadId": 1,
"errorThreadName": "main",
"device": {
"appBuild": "1337",
"appVersion": "7.1.0",
"appNamespace": "com.microsoft.appcenter.sasquatch.project",
"carrierCountry": "us",
"locale": "en_US",
"model": "Galaxy Nexus",
"oemName": "samsung",
"osApiLevel": 16,
"osBuild": "JRO03O",
"osName": "Android",
"osVersion": "5.0.0",
"screenSize": "720x1184",
"sdkName": "appcenter.custom",
"sdkVersion": "1.9.1",
"timeZoneOffset": -480
},
"exception": {
"frames": [
{
"className": "android.app.ActivityThread",
"fileName": "ActivityThread.java",
"lineNumber": 2575,
"methodName": "performResumeActivity"
},
{
"className": "android.app.ActivityThread",
"fileName": "ActivityThread.java",
"lineNumber": 2603,
"methodName": "handleResumeActivity"
},
{
"className": "android.app.ActivityThread",
"fileName": "ActivityThread.java",
"lineNumber": 2089,
"methodName": "handleLaunchActivity"
}
],
"innerExceptions": [
{
"frames": [
{
"className": "android.app.CustomActivity",
"fileName": "CustomActivity.java",
"lineNumber": 8673,
"methodName": "performCustomResume"
},
{
"className": "android.app.ActivityThread",
"fileName": "ActivityThread.java",
"lineNumber": 2565,
"methodName": "performResumeActivity"
}
],
"message": "Activity {com.microsoft.appcenter.sasquatch.project/com.microsoft.appcenter.sasquatch.activities.CrashSubActivity2} did not call through to super.onResume()",
"type": "android.app.CustomNotCalledException"
}
],
"message": "Unable to resume activity {com.microsoft.appcenter.sasquatch.project/com.microsoft.appcenter.sasquatch.activities.CrashSubActivity2}: android.app.SuperNotCalledException: Activity {com.microsoft.appcenter.sasquatch.project/com.microsoft.appcenter.sasquatch.activities.CrashSubActivity2} did not call through to super.onResume()",
"type": "java.lang.RuntimeException"
},
"threads": [
{
"frames": [
{
"className": "dalvik.system.NativeStart",
"fileName": "NativeStart.java",
"lineNumber": -2,
"methodName": "run"
}
],
"id": 369,
"name": "Binder_3"
},
{
"frames": [
{
"className": "dalvik.system.NativeStart",
"fileName": "NativeStart.java",
"lineNumber": -2,
"methodName": "run"
}
],
"id": 345,
"name": "Compiler"
}
]
}
]
}'
Przekazywanie dziennika awarii breakpad i minidump
Możesz przekazać niestandardową awarię breakpadu dla systemów Android i Windows. Na przykład:
curl -X POST \
'https://in.appcenter.ms/logs?Api-Version=1.0.0' \
-H 'Content-Type: application/json' \
-H 'app-secret: <app secret>' \
-H 'install-id: 00000000-0000-0000-0000-000000000001' \
-d '{
"logs":
[
{
"type": "managedError",
"id": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
"userId": "TestID",
"processId": 9448,
"processName": "Contoso.UWP.Puppet.exe",
"fatal": true,
"timestamp": "2019-10-08T06:22:23.530Z",
"architecture": "X64",
"timestamp": "2019-10-08T06:22:23.516Z",
"sid": "d4608adf-83b9-4f69-90ad-8bb0234080a7",
"device": {
"sdkName": "appcenter.custom",
"sdkVersion": "2.4.1-SNAPSHOT",
"model": "Parallels Virtual Platform",
"oemName": "Parallels Software International Inc.",
"osName": "WINDOWS",
"osVersion": "10.0.18363",
"osBuild": "10.0.18363.418",
"locale": "en-US",
"timeZoneOffset": -300,
"screenSize": "4608x2470",
"appVersion": "1.0",
"appBuild": "1.0",
"appNamespace": "10805zumoTestUser.AppCenter-Contoso.UWP.Puppet",
"carrierCountry": "us",
"wrapperSdkName": "custom.ndk"
},
"exception": {
"type": "minidump",
"wrapperSdkName": "custom.ndk"
}
},
{
"contentType": "application/octet-stream",
"errorId": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
"fileName": "minidump.dmp",
"id": "7b975468-5656-40a5-8242-c1907b26fc31",
"sid": "03693776-cdd4-46b8-bbda-12af457f1732",
"timestamp": "2019-10-08T06:22:23.516Z",
"type": "errorAttachment",
"device": {
"sdkName": "appcenter.custom",
"sdkVersion": "2.4.1-SNAPSHOT",
"model": "Parallels Virtual Platform",
"oemName": "Parallels Software International Inc.",
"osName": "WINDOWS",
"osVersion": "10.0.18363",
"osBuild": "10.0.18363.418",
"locale": "en-US",
"timeZoneOffset": -300,
"screenSize": "4608x2470",
"appVersion": "1.0",
"appBuild": "1.0",
"appNamespace": "10805zumoTestUser.AppCenter-Contoso.UWP.Puppet",
"carrierCountry": "us",
"wrapperSdkName": "custom.ndk"
},
"data": "<base64 encoded minidump>"
}
]
}'
Zastrzeżenia
Aby przekazać awarię breakpadu, wrapperSdkName
pole musi być ustawione na "custom.ndk" i należy dołączyć plik minidump jako załącznik do raportu o awarii. Dowiedz się, jak wysłać załącznik w sekcji załączników tej strony.
Aby symbolicznie przeprowadzić awarię, należy przekazać symbole za pośrednictwem interfejsu wiersza polecenia lub interfejsu API zgodnie z dokumentacją interfejsu API. Jeśli używasz aplikacji Breakpad z systemem Android, obsługiwane są obie opcje określone w dokumentacji zestawu Android NDK ; Jeśli używasz aplikacji Breakpad z systemem Windows, obsługiwana jest tylko opcja 2: "Przekaż symbole breakpadu".
Uwaga
Jeśli przekazujesz symbole z systemu macOS, musisz wyczyścić symbole wszelkich folderów dodatkowych, na przykład __MACOS zostanie wygenerowany i usunąć ten element, możesz użyć zip -d <symbols.zip> __MACOSX/\*
polecenia .
Przekazywanie raportu o błędach
Obsługiwane błędy są obecnie obsługiwane tylko w przypadku aplikacji Android, Xamarin, Unity, UWP, WPF i WinForms. Aby przekazać raport o błędach, upewnij się, że typ dziennika jest ustawiony na "handledError".
curl -X POST \
'https://in.appcenter.ms/logs?Api-Version=1.0.0' \
-H 'Content-Type: application/json' \
-H 'app-secret: <app secret>' \
-H 'install-id: 00000000-0000-0000-0000-000000000001' \
-d '{
"logs":
[
{
"type": "handledError",
"timestamp": "2019-10-08T06:22:23.516Z",
"appLaunchTimestamp": "2019-09-29T22:22:23.516Z",
"id": "118dee14-9193-4ac3-9ef0-f6c11b43f2c4",
"device": {
"appVersion": "11.0",
"appBuild": "1",
"sdkName": "custom.android",
"sdkVersion": "1.0.0",
"osName": "android",
"osVersion": "9.3",
"model": "Pixel",
"locale": "en-US"
},
"userId": "TestID",
"exception": {
"type": "System.IO.IOException",
"message": "Server did not respond",
"stackTrace": " at Contoso.Forms.Puppet.FakeService+<>c.<DoStuffInBackground>b__0_0 () [0x00000] in <7ad93f134a5d4c00a8db8be9aa9c0f76>:0 \n at System.Threading.Tasks.Task`1[TResult].InnerInvoke () [0x0000f] in <b38d4262627948c1b945a72f56ce6466>:0 \n at System.Threading.Tasks.Task.Execute () [0x00010] in <b38d4262627948c1b945a72f56ce6466>:0 \n--- End of stack trace from previous location where exception was thrown ---\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in <b38d4262627948c1b945a72f56ce6466>:0 \n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x0003e] in <b38d4262627948c1b945a72f56ce6466>:0 \n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x00028] in <b38d4262627948c1b945a72f56ce6466>:0",
"innerExceptions": [
{
"type": "System.IO.IOException",
"message": "Network down",
"stackTrace": " at Contoso.Forms.Demo.CrashesContentPage.SendHttp () [0x00002] in <4fd9174f6e18457b9721bfba2cd78098>:0 ",
"wrapperSdkName": "appcenter.xamarin"
},
{
"type": "System.ArgumentException",
"message": "Invalid parameter",
"innerExceptions": [
{
"type": "System.ArgumentOutOfRangeException",
"message": "It is over 9000!",
"stackTrace": " at Contoso.Forms.Demo.CrashesContentPage.ValidateLength () [0x00002] in <4fd9174f6e18457b9721bfba2cd78098>:0 ",
}
],
}
],
}
}
]
}'
Przekazywanie załącznika
Wszystkie załączniki muszą być skojarzone z raportem o awarii. Możesz przekazać załącznik z raportem o awarii w jednym wywołaniu lub w dwóch oddzielnych wywołaniach.
Właściwości specyficzne dla załącznika:
-
contentType
: wymagany ciąg z typem zawartości, na przykład "tekst/zwykły" dla tekstu. Przykłady obsługiwanego typu można znaleźć tutaj -
data
: wymagany ciąg z danymi zakodowanymi jako base 64 -
errorId
: wymagany ciąg zawierający unikatowy identyfikator skojarzonego raportu o błędach załącznika -
fileName
: wymagany ciąg dla awarii NDK ustawiony na "minidump.dmp"
Uwaga
Limit rozmiaru załączników wynosi obecnie 7 MB. Próba wysłania większego załącznika spowoduje wyzwolenie błędu.
Poniżej przedstawiono przykład przekazywania raportu o awarii i załącznika w jednym wywołaniu.
curl -X POST \
'https://in.appcenter.ms/logs?Api-Version=1.0.0' \
-H 'Content-Type: application/json' \
-H 'app-secret: <app secret>' \
-H 'install-id: 00000000-0000-0000-0000-000000000001' \
-d '{
"logs": [
{
"type": "managedError",
"timestamp": "2019-10-01T02:22:23.516Z",
"appLaunchTimestamp": "2019-09-29T22:22:23.516Z",
"id": "bca65f46-46ee-451b-83bb-2e358c3f45bf",
"fatal": true,
"processName": "com.microsoft.appcenter.sasquatch.project",
"device": {
"appVersion": "13.0",
"appBuild": "1",
"sdkName": "appcenter.android",
"sdkVersion": "1.0.0",
"osName": "android",
"osVersion": "9.3",
"model": "Pixel",
"locale": "en-US"
},
"userId": "118dee14",
"fatal": true,
"exception": {
"type": "CustomerIssue",
"frames": []
}
},
{
"type": "errorAttachment",
"contentType": "text/plain",
"timestamp": "2019-10-01T02:22:23.516Z",
"data": "aGVsbG8=",
"errorId": "bca65f46-46ee-451b-83bb-2e358c3f45bf",
"id": "7caaea8e-dab1-4588-993c-95de2d9a4fd1",
"device": {
"appVersion": "13.0",
"appBuild": "1",
"sdkName": "appcenter.android",
"sdkVersion": "1.0.0",
"osName": "android",
"osVersion": "9.3",
"model": "Pixel",
"locale": "en-US"
}
}
]
}'