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
にポインタを渡せばいいだけなのね。
こんな感じで階層表示される。
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
を使った方がいいのかもしれない。