brly.github.io
Erlang
13 Mar 2018

recon_trace

recon_trace の話、は既に検索すると沢山出てくるのであんまり出てこなかった tips を。

対象となる module がロードされてない場合は trace されない

recon_trace:calls の戻り値は trace 対象となった関数の数が返るが、対象の関数が一つもなかった場合は 0 が返る。 typo もなく正しく与えたはずなのにうまく trace 対象とならない場合があり、その時は未ロードの場合に起きうる。

その時は Module:module_info(module) とか叩くと強制的にロードされるので、その後に trace 出来るようになる。

return_trace() は 2 回カウントされる

trace 時に recon_trace:calls({M, F, fun(_) -> return_trace() end}, 10) などすると、関数の呼び出し時 trace だけでなく、関数の戻り値も trace してくれるようになる。すると 2回 trace することになる。

同時に trace 対象とするためにはリストに複数与える

recon_trace:calls([{ModuleA, F, 0}, {ModuleB, F, 0}], 10) のようにする。

$ recon_trace:calls({ModuleA, F, 0}, 10).
$ recon_trace:calls({ModuleB, F, 0}, 10).

のようにしても ModuleB の trace しかされない。おそらく対象は trace の度にリセットされている。