25

以前DTSendSignalFlagは、フレームワークの一部である便利なツールがありDTPerformanceSessionました。これにより、フラグをプログラムで Instruments に挿入できます ( Xcode Instruments トレースの比較を参照)。この機能は iOS 7 で動作しなくなりました。

DTSendSignalFlagiOS 7 での作業に成功した人はいますか? シグナル フラグは、コードを介してプログラムで Instruments にフラグをポストする便利な方法です (Instruments で複雑なアプリを診断するときに非常に役立ちます) が、iOS 7 シミュレーターで実行すると、Instruments でプログラムで作成したフラグが表示されません (しかし、iOS 6 シミュレーター用に Xcode 5 をビルドすると動作します)。

4

2 に答える 2

43

フラグを使用する代わりに、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 番目のパラメーターを一意の識別子として使用して繰り返し呼び出しと呼び出しを照合しstartend最後のパラメーターを使用して 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_signpostAPI は似ていますが、以下を含める必要があります。

#import <sys/kdebug_signpost.h>

明らかに、コードの列挙を定義する方法も変わります。

このkdebug_signpostAPI は 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
于 2016-09-09T17:15:54.670 に答える