Protokolle in iOS, Folge 2: os_signpost / Sudo Null IT News

Irgendwann in der Entwicklung der Anwendung erhalten Sie Feedback von Benutzern: Wenn Sie beispielsweise auf die Schaltfläche „Adresse auswählen“ klicken, friert die Anwendung zunächst einige Sekunden lang ein und zeigt erst dann einen Bildschirm mit einer Liste von Adressen. Niemand hat speziell langsamen Code geschrieben, aber er kam von irgendwo her.

Heute werde ich Ihnen sagen, wie Apple vorschlägt, dieses Problem mithilfe von Protokollen zu lösen.

Im letzten Artikel haben wir gelernt, wie man sich in Console.app anmeldet, um bequem durch die Protokolle zu navigieren. Aber dort haben wir gewöhnliche Textnachrichten abgelegt. Ja, sie sind in chronologischer Reihenfolge. Ja, sie haben alle notwendigen Informationen. Aber hier haben wir eine Netzwerkschicht, und darin gibt es zum Beispiel eine Einschränkung – nicht mehr als 5 parallele Anfragen gleichzeitig. Und in den Protokollen sehen wir nur eine Reihe von Nachrichten Start: Request und End: Request, wobei jedem Ende die Dauer der Anfrage gegenübersteht:

Anhand solcher Protokolle ist es schwierig zu verstehen, was womit begonnen hat und wann es geendet hat, da die letzten Protokolle optisch in keiner Weise mit den ursprünglichen zusammenhängen. Lassen Sie uns verbinden. Aber dafür müssen os_log und Console.app durch andere Tools ersetzt werden.

Zeitprofiler

Apple bietet an, Messungen in einem speziellen Tool anzusehen – Time Profiler, es wird mit Xcode geliefert.

Zum Starten müssen Sie in Ihrem Projekt auf Produkt → Profil klicken. Es erscheint ein Fenster mit einer ganzen Reihe von Werkzeugen:

Unter ihnen müssen Sie Time Profiler auswählen. Klicken Sie in dem sich öffnenden Fenster oben links auf die Aufnahmeschaltfläche. Einige Diagramme werden sofort im Tool gezeichnet:

Natürlich können Sie hier einige Statistiken innerhalb der Anwendung sehen, aber es ist schwierig, etwas eindeutig daraus zu sagen. Dies liegt daran, dass Time Profiler zu zeigen versucht, wo wir die CPU stark belastet haben, und wir haben dies nicht getan: Es dauert lange, um online zu gehen, aber überhaupt nicht schwer.

Um lange, aber nicht schwere Operationen zu sehen, müssen Sie sie in der Anwendung mit os_signpost zusichern:

// Aufruf von os_signpost erfordert eine OSLog-Instanz let osLog = OSLog(subsystem: “LogsDemo”, category: “”) // generiert eine zufällige ID // durch diese ID verknüpfen wir Start und Ende der Messung let signpostID: UInt64 = .random // das Startbeispiel protokollieren let startMessage = “Start: Request” os_signpost(.begin, log: osLog, name: name, signpostID: signpostID, “%{public}@”, startMessage) // den gewünschten Code ausführen zum Beispiel let request = SomeNetworkRequest() let data = networkService.getData(for: request) // das Ende der Umfrage protokollieren let endMessage = “End: Request” os_signpost(.end, log: osLog, name: “”, signpostID : wegweiserID, “%{public}@”, endMessage)

Wir starten die Aufzeichnung im Time Profiler neu und es gibt dort keine Protokolle. Tatsache ist, dass Time Profiler keine Wegweiser anzeigt, es sei denn, es wird zwangsweise verlangt. Fragen wir mal: Klicken Sie oben rechts auf das Pluszeichen und finden Sie os_signpost in der Liste. Fügen Sie es mit einem Doppelklick hinzu oder ziehen Sie es in die Liste auf der linken Seite:

Beginnen wir erneut mit der Aufnahme. Die Anwendung startet und alle unsere Messungen werden in os_signpost angezeigt:

Messnamen

Jede Messung wird mit einem separaten blauen Balken angezeigt. Jetzt haben wir eine ganze Reihe solcher Messungen, und es ist nicht klar, welche angezeigt wird. Wie kann man unterscheiden, wo welche Funktion auf dem Chart gezeichnet ist? Time Profiler kann die Namen von Messungen signieren, wenn wir unsere Zeitleiste in der Höhe erhöhen. Bewegen Sie dazu den Cursor an den unteren Rand der Zeitleiste im linken Bereich (auf dem Bildschirm blau hervorgehoben) und strecken Sie sie:

Aber es ist schwierig, sich in einem solchen Paket von Messungen zurechtzufinden.

Protokollquelle

Tatsächlich können Sie eine Protokollquelle an Time Profiler senden, und dann wird alles danach gruppiert.

Übergeben Sie dazu den Namen des aktuellen Moduls und der Datei an OSLog:

let osLog = OSLog (Subsystem: Modul, Kategorie: Dateiname)

Und in os_signpost – der Name unserer Funktion:

os_signpost(.begin, log: osLog, name: function, signpostID: signpostID, “%{public}@”, endMessage)

Wenn Sie nicht verstehen, woher der Name des Moduls, der Datei und der Funktion stammt, lesen Sie den vorherigen Artikel, ich erzähle es dort.

Jetzt sind im Time Profiler alle Messungen übersichtlich in Module, Dateien und Funktionen sortiert:

Auth, Netzwerkmodule erschienen im Panel auf der linken Seite.  Neuigkeiten.  Das LogsDemo-Modul enthält Messungen aus der Hauptanwendung.Auth, Netzwerkmodule erschienen im Panel auf der linken Seite. Neuigkeiten. Das LogsDemo-Modul enthält Messungen aus der Hauptanwendung.

Sie können jedes Modul erweitern und bestimmte Dateien anzeigen:

Das Newsfeed-Modul hat Messungen aus 3 Dateien: Newsfeed, NewsfeedParser und Storage.Das Newsfeed-Modul hat Messungen aus 3 Dateien: Newsfeed, NewsfeedParser und Storage.

Verbesserte Messnamen

Jetzt sind alle Messungen nach Modulen und Dateien gruppiert, und ihr Name wird auch jeweils vorangestellt. Aber in unserem Netzwerkmodul heißen alle Messungen gleich. Um zu lernen, wie man sie unterscheidet, fügen wir die Anforderungs-URL am Ende der Messnachricht hinzu.

let message = “Ende: \(url)”

Und jetzt sind die Messungen viel nützlicher geworden:

Jedes Netzwerkanforderungsmuster gibt an, an welche URL es ging.Jedes Netzwerkanforderungsmuster gibt an, an welche URL es ging.

Statistiken

Im obigen Screenshot sehen Sie im unteren Bereich, wie oft jede Messung aufgerufen wurde, wie lange sie im Durchschnitt gedauert hat, sowie die Minimal- und Maximalwerte. Sie können beispielsweise messen, wie lange es dauert, Antworten von der API im Datenmodell zu parsen. Dies kann sowohl für eine bestimmte Datei als auch für das gesamte Modul angezeigt werden – je nachdem, was Sie im linken Bereich im Zeitprofiler auswählen.

Die Gruppierung von Statistiken basiert auch auf Meldungen in den Messungen. In meinem Beispiel sind die Anfangsmeldungen für alle Netzwerkanfragen gleich – Start: Request. Aber die abschließende Nachricht für jede URL ist anders. Auf diese Weise können Sie bequem Statistiken sowohl für alle Abfragen auf einmal als auch für jede einzelne Abfrage anzeigen.

Was ist noch möglich?

Time Profiler kann nicht nur Messungen anzeigen, sondern auch einfache einmalige Ereignisse: Protokolle mit gewöhnlichen Textnachrichten oder mit Fehlern.

Um dies für Sie zu ermöglichen, müssen Sie den Ereignistyp .event an os_signpost übergeben:

let message = “Antwort gespeichert” os_signpost(.event, log: osLog, name: name, signpostID: signpostID, “%{public}@”, message)

Er zeichnet dies mit regelmäßigen Punkten auf der Zeitleiste. Wenn Sie den Mauszeiger über einen Punkt bewegen, können Sie genau erfahren, was in diesem Moment passiert ist:

Fazit

Die Kombination aus os_signpost und Time Profiler ist ein mächtiges Werkzeug. Sie können messen, wie lange Sie für bestimmte Berechnungen gebraucht haben, wie oft Sie online gegangen sind, und auch herausfinden, welches Datenmodell am längsten zum Parsen brauchte.

Aber um es zu verwenden, müssen Sie eine Menge begleitenden Code schreiben. Es ist auch notwendig, die Messungen der Ausführung von Funktionen zu formatieren, die üblichen Meldungen korrekt anzuzeigen und die Fehler irgendwie auf andere Weise zu verschieben. Wie man das vermeidet, erzähle ich im nächsten Artikel.

Abonnieren Sie den Telegrammkanal Dodo-Mobilum in einem kurzen Format mehr über die mobile Entwicklung bei Dodo Engineering zu erfahren.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *