フラグを使用する代わりに、Instrument の「Points of Interest」に取り込まれた、プログラムで挿入された標識を使用できるようになりました。
iOS 13 および macOS 10.15 では、os_signpost
. これは、WWDC 2019 ビデオGetting Started with Instrumentsで説明されています。
たとえば、Swift では次のようになります。
統合ログ フレームワークをインポートします。
import os.log
OSLog
関心のあるポイントの を作成します。
private let pointsOfInterest = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: .pointsOfInterest)
関心のあるポイントの範囲を開始する場合は、関心の.begin
あるポイントを次のように指定できます。
let id = OSSignpostID(log: pointsOfInterest)
os_signpost(.begin, log: pointsOfInterest, name: "Download", signpostID: id, "Download %d", index)
関心のあるポイントの範囲を終了する場合は、次のことができ.end
ます。
os_signpost(.end, log: pointsOfInterest, name: "Download", signpostID: id, "Download %d", index)
時間の範囲ではなく、単一の道しるべに興味がある場合は、次のように投稿できます.event
。
os_signpost(.event, log: pointsOfInterest, name: "Done", "All done")
またはObjective-Cで:
統合ログ標識フレームワークをインポートします。
@import os.signpost;
OSLog
関心のあるポイントの を作成します。
os_log_t log = os_log_create("ViewController", OS_LOG_CATEGORY_POINTS_OF_INTEREST);
関心のあるポイントの範囲を開始する場合は、関心の.begin
あるポイントを次のように指定できます。
os_signpost_id_t identifier = os_signpost_id_generate(log);
os_signpost_interval_begin(log, identifier, "Download", "Started %d", index);
関心のあるポイントの範囲を終了する場合は、次のことができ.end
ます。
os_signpost_interval_end(log, identifier, "Download", "Finished %d", index);
時間の範囲ではなく、単一の道しるべに興味がある場合は、次のように投稿できます.event
。
os_signpost_event_emit(log, OS_SIGNPOST_ID_EXCLUSIVE, "Done");
いずれにせよ、「Points of Interest」インストルメントは、Instruments で一連のダウンロードと解析操作をグラフィカルに表すことができるようになりました (各キューは、キューごとに 2 つの同時操作に制限されています)。
name
値 (1 つのセットは名前を使用し、もう 1 つのセットはDownload
を使用Parse
) は、Points of Interest ツールで異なるスイムレーンに適切に分割されていることに注意してください。また、オプションのフォーマット文字列を使用したため、実際にメッセージを確認でき、各ダウンロードおよび解析操作をアプリ内の特定のタスクに明確に関連付けることができます。
上記では、複数の範囲が重複していたため、オプションのOSSignpostID
パラメーターを使用しました。特定.end
のものと対応する.begin
. 対象範囲のポイントを使用していないか、範囲が重複していない場合、あいまいさの可能性がなければ、技術的にはこのオプションのパラメーターを使用する必要はありません。(これらの道標識別子を使用する場合でもname
、関連付けられている.begin
と.end
道標も一致していることを確認してください。そうしないと、Instruments は、同じ道標 ID であっても、同じ対象範囲の開始点と終了点としてそれらを識別しません。)
とにかく、「Points of Interest」ツールに情報が入力されたので、範囲をダブルクリックして選択するか、トリプルクリックして検査範囲を設定することができます。
iOS 10 および macOS 10.12 では、kdebug_signpost
. これは、WWDC 2016 ビデオSystem Trace in Depth で説明されています。
個別の時間がかかるプロセスについては、 と を使用できkdebug_signpost_start
ますkdebug_signpost_end
。例えば:
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)
}
ある瞬間をマークするには、次を使用できますkdebug_signpost
。
kdebug_signpost(SignPostCode.done.rawValue, 0, 0, 0, SignPostColor.red.rawValue)
最初のパラメータは、Instruments で使用する「標識コード名」に対応する一意の数値コードです。任意の値 (0 から 16383 の間) を使用できますが、タスクの種類を指定するものを使用します。
enum SignPostCode: UInt32 { // some custom constants that I'll reference in Instruments
case download = 0
case parse = 1
case done = 2
}
残りのパラメーターは任意のUInt
値にすることができますが、私の例では、2 番目のパラメーターを一意の識別子として使用して繰り返し呼び出しと呼び出しを照合しstart
、end
最後のパラメーターを使用して Instruments でリージョンを色分けします。
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
}
これが完了したら、Instruments でアプリをプロファイリングし、Instruments ツールバーの右側にある [+] ボタンをクリックして、[Points of Interest] を追加できます。最初のパラメーターとして道標に渡した数値と一致するように「道標コード名」を構成することで、Instruments が実際にそれらのコードを変換してくれます。アプリのプロファイルを作成すると、関心のあるポイントが明確に強調表示されます。
このスナップショットでは、7 つのダウンロード操作 (オレンジ色) と 7 つの解析操作 (緑色) をそれぞれ一度に 2 つに制限してプロファイリングしました。そして、それらが完了したら、1 つの「完了」標識 (赤いピン) を掲示しました。ただし、このデモ アプリの詳細は重要ではありません。これは、Instruments の「関心のあるポイント」で単一の道標と開始/終了の道標がどのようにレンダリングされるかを示しているだけです。
主な問題は、コード内のイベントと Instruments で表示されるイベントとの間に明確な対応があることです。そしてcontrol、標識範囲のリストのエントリを クリックして、必要に応じてインストルメントに「時間フィルタを設定」するように指示し、他のインストゥルメント (割り当てまたは時間プロファイラーなど) に戻ったときに検査範囲を指定することができます。アプリ内の関連する関心のあるポイントに絞り込まれます。
上記はSwiftであることに注意してください。Objective-C のkdebug_signpost
API は似ていますが、以下を含める必要があります。
#import <sys/kdebug_signpost.h>
明らかに、コードの列挙を定義する方法も変わります。
このkdebug_signpost
API は iOS 10/macOS 10.12 で導入されたことに注意してください。ヘッダーは、以前の OS バージョンが以下を使用できることを示していますsyscall
。
以前のバージョンのオペレーティング システムでは、アプリケーションは次のものを使用できました。
syscall(SYS_kdebug_trace, APPSDBG_CODE(DBG_MACH_CHUD, <your event code>) | DBG_FUNC_<type>, arg1, arg2, arg3, arg4);
Instrumentsによって表示されるイベントを記録します。syscall(2)
は非推奨になり、このインターフェイスが上記の呼び出しを置き換えます。
注:syscall
以前の OS バージョンで使用する必要がある場合は、インポートする必要があります<sys/kdebug.h>
。
#import <sys/kdebug.h>
また、どのヘッダーにも の宣言を見つけることができませんでしたがSYS_kdebug_trace
、オンラインでこの値が であるというリファレンスを偶然見つけて、180
経験的に検証しました。
#ifndef SYS_kdebug_trace
#define SYS_kdebug_trace 180
#endif