なるようになるかも

力は多くの場合、その人の思いを超えない。

Activity Tracing どう使うのか謎だったので調べたメモ。

static void hoge() {
    static os_log_t log;
    static os_activity_t activity;
    static os_activity_t activity2;
    static os_activity_t activity3;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        log = os_log_create("activity", "a butterfly's dream");
        activity = os_activity_create("dream", OS_ACTIVITY_CURRENT, OS_ACTIVITY_FLAG_DEFAULT);
        activity2 = os_activity_create("real", activity, OS_ACTIVITY_FLAG_DEFAULT);
        activity3 = os_activity_create("dream", activity2, OS_ACTIVITY_FLAG_DEFAULT);
    });
    
    struct os_activity_scope_state_s state = {};
    os_log_info(log, "Graveyard Memory");
    os_activity_scope_enter(activity, &state);
    os_log_info(log, "Nightmare Counselor");
    struct os_activity_scope_state_s state2 = {};
    os_activity_scope_enter(activity2, &state2);
    os_log_info(log, "Historical Vacation");
    struct os_activity_scope_state_s state3 = {};
    os_activity_scope_enter(activity3, &state3);
    os_log_error(log, "Cosmic Horoscope");
    os_activity_scope_leave(&state3);
    os_activity_scope_leave(&state2);
    os_activity_scope_leave(&state);
}

os_activity_scope_state_s は空の構造体を作って os_activity_scope_enter にポインタを渡せばいいだけなのね。

f:id:quesera2:20180429190527p:plain

こんな感じで階層表示される。

block でネストしても良いのであれば、os_activity_initiate マクロだと、Activity の作成+スコープ開始を同時にやってくれるので便利なのだけれど、Activity Tracing のリファレンス には載っていない…。

os_activity_initiate("dream", OS_ACTIVITY_FLAG_DEFAULT, ^{
    os_log_info(log, "Northeast Nostalgia");
    os_activity_initiate("real", OS_ACTIVITY_FLAG_DEFAULT, ^{
        os_log_info(log, "Forgotten Paradise");
        os_activity_initiate("dream", OS_ACTIVITY_FLAG_DEFAULT, ^{
            os_log_error(log, "Shining Future");
        });
    });
});

OSLog が記録しているファイル名や行数の情報を知りたい

Don’t include symbolication information or source file line numbers in messages. The system automatically captures this information.

「OSLog は自動的にソースファイル名と行数を収集するから、そういった情報をメッセージに含めるべきではない」というリファレンスの記述に対して、じゃあどうやって見ればいいの?っていう疑問が当然あると思うんですけれど、何も書いてないのですよね…。

Developer Forum を調べたところ、os_log source file and line numbers に記載を発見。

log コマンドを --source オプションを付けて実行したときに見れるっぽい。DevForum だと Swift だと動作しないという話があったけれど、今はちゃんと Swift コードでも行数が出るっぽい。

関数でラップすると、出る行数はラッパーになるので、やはり os_log を直接呼ぶしかないっぽい。@inline(__always) を使ってもダメだった。

$ log stream --level debug --source --predicate 'subsystem == "activity"'
2018-04-29 21:34:40.264429+0900 0x28b38e   Info        0x0                  31286  <Activity`hoge (hogehoge.c:28)> [activity:a butterfly's dream] Graveyard Memory
2018-04-29 21:34:40.264499+0900 0x28b38e   Info        0x786a3              31286  <Activity`hoge (hogehoge.c:30)> [activity:a butterfly's dream] Nightmare Counselor
2018-04-29 21:34:40.264540+0900 0x28b38e   Info        0x786a4              31286  <Activity`hoge (hogehoge.c:33)> [activity:a butterfly's dream] Historical Vacation
2018-04-29 21:34:40.264599+0900 0x28b38e   Error       0x786a5              31286  <Activity`hoge (hogehoge.c:36)> [activity:a butterfly's dream] Cosmic Horoscope
2018-04-29 21:34:40.264848+0900 0x28b38e   Info        0x786a6              31286  <Activity`__hoge_block_invoke.3 (hogehoge.c:40)> [activity:a butterfly's dream] Northeast Nostalgia
2018-04-29 21:34:40.264918+0900 0x28b38e   Info        0x786a7              31286  <Activity`__hoge_block_invoke.6 (hogehoge.c:40)> [activity:a butterfly's dream] Forgotten Paradise
2018-04-29 21:34:40.264982+0900 0x28b38e   Error       0x786a8              31286  <Activity`__hoge_block_invoke.9 (hogehoge.c:40)> [activity:a butterfly's dream] Shining Future
2018-04-29 21:34:40.269216+0900 0x28b38e   Default     0x0                  31286  <Activity`main (main.swift:26)> [activity:a butterfly's dream] Dominated Realism

os_activity_initiate の方が圧倒的に簡潔に書けるのですけれど、block を開始した行数しか記録に残らないので、os_activity_scope_enter を使った方がいいのかもしれない。