Alternatywa dla DTSendSignalFlag do identyfikacji kluczowych zdarzeń w instrumentach?

Kiedyś było ładne narzędzie, DTSendSignalFlag, Część DTPerformanceSession framework, za pomocą którego można programowo wstawiać flagi do instrumentów (Zobacz Xcode Instruments trace comparison ). Ta funkcja przestała działać w systemie iOS 7.

Czy komuś się udało dostać DTSendSignalFlag do pracy w iOS 7? Flagi sygnałowe to (były?) przydatny sposób programowego umieszczania FLAG w instrumentach za pomocą kodu (naprawdę pomocny przy diagnozowaniu skomplikowanych aplikacji w instrumentach), ale nie widzę mojego programowo tworzone flagi w instrumentach, gdy uruchamiam na symulatorze iOS 7 (ale działa, gdy mam Xcode 5 kompilacji dla symulatora iOS 6).

Author: Community, 2013-09-26

2 answers

Zamiast używać FLAG, możemy teraz używać programowo wstawianych drogowskazów, które są uchwycone w "punktach zainteresowania" instrumentu.

W iOS 13 i macOS 10.15 możemy użyć os_signpost. Jest to zilustrowane w wideo WWDC 2019 pierwsze kroki z instrumentami.

Na przykład w języku Swift:

  • Importuj zunifikowany mechanizm logowania:

    import os.log
    
  • Utwórz OSLog dla punktów zainteresowania:

    private let pointsOfInterest = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: .pointsOfInterest)
    
  • Kiedy jeśli chcesz rozpocząć zakres punktów procentowych, możesz .begin punkt zainteresowania:

    let id = OSSignpostID(log: pointsOfInterest)
    os_signpost(.begin, log: pointsOfInterest, name: "Download", signpostID: id, "Download %d", index)
    
  • Kiedy chcesz zakończyć zakres punktów procentowych, możesz .end to:

    os_signpost(.end, log: pointsOfInterest, name: "Download", signpostID: id, "Download %d", index)
    
  • Jeśli nie interesuje Cię zakres czasu, a raczej pojedynczy drogowskaz, możesz po prostu opublikować .event:
    os_signpost(.event, log: pointsOfInterest, name: "Done", "All done")
    

Lub w Objective-C:

  • Importuj zunifikowany Framework logging signposts:

    @import os.signpost;
    
  • Utwórz OSLog dla punktów zainteresowania:

    os_log_t log = os_log_create("ViewController", OS_LOG_CATEGORY_POINTS_OF_INTEREST);
    
  • Kiedy chcesz rozpocząć zakres punktów procentowych, możesz .begin punkt zainteresowania:
    os_signpost_id_t identifier = os_signpost_id_generate(log);
    os_signpost_interval_begin(log, identifier, "Download", "Started %d", index);
    
  • Kiedy chcesz zakończyć zakres punktów procentowych, możesz .end to:

    os_signpost_interval_end(log, identifier, "Download", "Finished %d", index);
    
  • Jeśli nie interesuje Cię zakres czasu, a raczej pojedynczy drogowskaz, możesz po prostu opublikować .event:
    os_signpost_event_emit(log, OS_SIGNPOST_ID_EXCLUSIVE, "Done");
    

W każdym razie, instrument "Points of Interest" może teraz graficznie reprezentować szereg pliki do pobrania i operacje parsowania (każda Kolejka ograniczona do dwóch jednoczesnych operacji w kolejce) w instrumentach:

Tutaj wpisz opis obrazka

Zauważ, że wartości name (jeden zestaw użyłem nazwy Download i drugi użyłem Parse) są ładnie podzielone na różne pasy pływackie w narzędziu punkty zainteresowania. A ponieważ użyłem opcjonalnych ciągów formatowych, mogę rzeczywiście zobaczyć wiadomości, w których mogę wyraźnie skorelować każdą operację pobierania i analizowania do określonego zadania w moim app.

Powyżej użyłem opcjonalnych parametrów OSSignpostID, ponieważ miałem wiele zakresów nakładających się na siebie i chciałem uniknąć nieporozumień związanych z powiązaniem konkretnego .end z odpowiadającym mu .begin. Jeśli nie używasz zakresów punktów zainteresowania lub nie masz nakładających się zakresów, technicznie nie musisz używać tego opcjonalnego parametru, jeśli nie jest to możliwe. (Nawet jeśli używasz tych identyfikatorów drogowskazów, upewnij się, że name z powiązanego .begin i .end drogowskazy również pasują, inaczej Instrumenty nie będą identyfikować ich jako początku i końca tego samego zakresu zainteresowania, nawet z tym samym identyfikatorem drogowsku.)

W każdym razie, teraz, gdy masz narzędzie "punkty zainteresowania" wypełnione informacjami, możesz dwukrotnie kliknąć zakres, aby go wybrać, lub trzykrotnie kliknąć na nim, aby również ustawić zakres kontroli.


W iOS 10 i macOS 10.12 użyliśmy kdebug_signpost. Jest to zilustrowane w wideo WWDC 2016 System Trace in Głębokość .

Dla tych procesów, które zajmują dyskretną ilość czasu, możemy użyć kdebug_signpost_start i kdebug_signpost_end. Na przykład:

kdebug_signpost_start(SignPostCode.download.rawValue, UInt(index), 0, 0, SignPostColor.orange.rawValue)
performDownload {
    kdebug_signpost_end(SignPostCode.download.rawValue, UInt(index), 0, 0, SignPostColor.orange.rawValue)
}

Aby zaznaczyć jedną chwilę w czasie, możemy po prostu użyć kdebug_signpost:

kdebug_signpost(SignPostCode.done.rawValue, 0, 0, 0, SignPostColor.red.rawValue)

Pierwszy parametr to tylko jakiś unikalny kod numeryczny, który odpowiada "nazwie kodowej drogowskazu", której będziemy używać w instrumentach. Możesz używać dowolnych wartości (między 0 a 16383), ale ja używam czegoś, co określa typ zadania:

enum SignPostCode: UInt32 {   // some custom constants that I'll reference in Instruments
    case download = 0
    case parse = 1
    case done = 2
}

Reszta parametry mogą być dowolnymi wartościami UInt, ale w moim przykładzie użyję drugiego parametru jako unikalnego identyfikatora, aby dopasować powtarzane wywołania start i end, a ostatni parametr użyję do kodowania kolorów moich regionów w instrumentach:

enum SignPostColor: UInt {    // standard color scheme for signposts in Instruments
    case blue = 0
    case green = 1
    case purple = 2
    case orange = 3
    case red = 4
}

Po wykonaniu tej czynności możesz następnie profilować aplikację w instrumentach, kliknąć przycisk " + "po prawej stronie paska narzędzi instrumentów i dodać"punkty zainteresowania". Poprzez skonfigurowanie "nazw kodowych drogowskazów", aby pasowały do wartości liczbowych Przekazałem jako pierwszy parametr do moich drogowskazów, Instrumenty rzeczywiście przetłumaczą te kody dla mnie. Raz profil aplikacji i teraz moje punkty zainteresowania wyraźnie zaznaczone dla mnie:

Tutaj wpisz opis obrazka

W tym migawce profilowałem siedem operacji pobierania (w kolorze pomarańczowym) i siedem operacji parsowania (w kolorze zielonym), ograniczonych odpowiednio do dwóch na raz. A kiedy były gotowe, zamieściłem pojedynczy drogowskaz "gotowe" (pin red). Ale szczegóły tej aplikacji demo są nie krytyczne, ale raczej ilustruje to, w jaki sposób pojedyncze drogowskazy i znaki początku/końca są renderowane w "punktach zainteresowania"instrumentów.

Głównym problemem jest to, że mam teraz wyraźną korespondencję między wydarzeniami w moim kodzie a tym, co widzę w instrumentach. I mogę kontrolować -kliknij na wpis na liście zakresów drogowskazów i powiedz instrumentom "Ustaw filtr czasu", jeśli chcę, tak, że kiedy wrócę do innych instrumentów (alokacje lub Profiler czasu lub cokolwiek), zakres kontroli jest filtrowany do odpowiednich punktów zainteresowania w mojej aplikacji.


Uwaga, powyższe jest szybkie. W Objective-C, API {[36] } jest podobne, ale musisz dołączyć:

#import <sys/kdebug_signpost.h>

Oczywiście, jak zdefiniujesz swoje wyliczenia dla kodów również się zmieni.

[51]}Uwaga, To kdebug_signpost API zostało wprowadzone w systemie iOS 10/macOS 10.12. Nagłówki mówią nam, że wcześniejsze wersje systemu operacyjnego mogły używać syscall:

W poprzednich wersjach systemu operacyjnego, zastosowanie:

syscall(SYS_kdebug_trace, APPSDBG_CODE(DBG_MACH_CHUD, <your event code>) | DBG_FUNC_<type>, arg1, arg2, arg3, arg4);

Aby rejestrować zdarzenia, które byłyby wyświetlane przez Instrumenty. syscall(2) jest teraz przestarzały i ten interfejs zastępuje powyższe wywołanie.

Uwaga: Jeśli będziesz musiał używać syscall na wcześniejszej wersji systemu operacyjnego, będziesz musiał zaimportować <sys/kdebug.h>:

#import <sys/kdebug.h>

Również nie byłem w stanie znaleźć deklaracji SYS_kdebug_trace w żadnym z nagłówków, ale natknąłem się na odniesienie online, które mówiło, że ta wartość jest 180, co empirycznie "verified": {]}

#ifndef SYS_kdebug_trace
#define SYS_kdebug_trace 180
#endif
 37
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-25 19:40:21

2019

Drogowskaz został zaktualizowany o łatwiejsze API. Wideo tutaj (Time: 20:40)

Https://developer.apple.com/videos/play/wwdc2019/411/

Zobacz debugowanie wydajności procesora w dokumentacji logowania Apple.

Https://developer.apple.com/documentation/os/logging

 1
Author: skymook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-19 16:15:06