Upgrade to Pro — share decks privately, control downloads, hide ads and more …

VIMでコールツリーを読む

B58a238a6c20c0ad743e71cee948d32b?s=47 nzzy
July 07, 2018

 VIMでコールツリーを読む

VIMでコールツリーを読むのは最高!という話

B58a238a6c20c0ad743e71cee948d32b?s=128

nzzy

July 07, 2018
Tweet

Transcript

  1. 1 / 14 VIM でコールツリーをコールツリーを読む読むむ nzzy

  2. 2 / 14 コールツリー解析とと VIM 設計がわからないプがわからないプログラムのソプログラムのソースコードのソースコードソースコード を理解するのに、理解するのに、コーするのソースコードに、コールツリーがコールツリーが便利というといプログラムのソう 事と、読むのにと、コールツリーが読むのにむのソースコードに VIM が超便利というだったといプログラムのソう

    件の紹介をしますのソースコード紹介をします!を理解するのに、します!
  3. 3 / 14 コールツリーとは • プログラムにて、関数がどにて、関数がどのよう関数がどのように呼がどのように呼ばれたかを記ばれたかを記記 録したもの。したもの。 test.py の例: import

    sys def barbar(): ... def bar(): barbar() def foo(): bar() if __name__ == ‘__main__’: foo() コールツリー: foo() bar() barbar()
  4. 4 / 14 コールツリーのソースコード使いどころいプログラムのソどころ • ソースコード読んでも動作が読んでも動作がわんでも動作がわかりにくいがわかりにくい場合、対場合、関数がどのよう対 象のプログラムをのプログラムにて、関数がどを記実際に動作させて、に動作がわかりにくいさせて、関数がどのようコールツリー を記記録したもの。し、関数がどのよう動作がわかりにくいを記掴む。む。 動作がわかりにくいがわかりにくい場合、対例: ・〜ド読んでも動作がリブンでかつ独自アーでかつ独自アーキテク独自アーキテクチャアーキテクチャなプログなプログプログ

    ラムにて、関数がど ・抽象のプログラムを化の塊なプログラの塊なプログラムなプログプログラムにて、関数がど ・その他、関数がどのよう設計ポリシーが全くポリシーが全く不明なプログく不明なプログラムなプログプログラムにて、関数がど (笑)己の知識不笑)己の知識不足も含の知識不足も含む(笑)も含む(笑)む(笑)己の知識不笑)
  5. 5 / 14 コールツリーの理解の仕方のコ理解の仕方のコツの理解の仕方のコ仕方のコツの理解の仕方のココツ コールツリーの上位だけでプログラだけでプログラムにて、関数がどの流れの概要れの概要 を記つ独自アーキテクかみ、関数がどのよう詳細を知りたい場所を記知りたい場合、対場所の呼び出しをたの呼ばれたかを記び出しをたどっ出しをたどっしを記たどっ て、関数がどのよう詳細を知りたい場所を記把握していくのがコしてい場合、対くのがコツ。 コールツリー 上位だけでプログラの流れの概要れ: foo()

    bar() barbar() exit() bar() の内部のの コールの流れの概要れ: hoge() fuga() fugafuga() 概要を記掴む。む 詳細を知りたい場所を記読んでも動作がわんでい場合、対く
  6. 6 / 14 コールツリーを実際に見てみる実際に見てみるとに見てみると見てみるとてみると 実は理屈はわかっは理屈はわかって理屈はわかってもは理屈はわかってわかっても ... 現実は理屈はわかっに出力されるコールされるコール ツリーを理解するのに、見ると、量が膨大ると、コールツリーが量が膨大すぎて概が膨大すぎて概要把握すぎて概要把握もままなもままな らないプログラムのソ事と、読むのにがわかると思います。いプログラムのソます。 なにかツールを理解するのに、使いどころえばなんとかなるかも?

    そうだ! VIM があるじゃないプログラムのソか!
  7. 7 / 14 VIM fold 機能を使うを理解するのに、使いどころう • “{{{“ 〜” }}}”

    で囲まれたブロッ囲まれたブロックまれたブロックを、畳んだり、を理解するのに、、コールツリーが畳んだり、開いんだり、コールツリーが開いいプログラムのソ たりで囲まれたブロッきる機能を使う。 set foldmethod=marker で囲まれたブロッ発動。 main() /* {{{ */ { hoge() fuga() } /*}}}*/ hoge() /*{{{ */ { hogehoge() }/*}}}*/ :set foldmethod=marker +main() +hoge() “zo” を理解するのに、押すと、カーソルすと、コールツリーがカーソル のソースコードある畳んだり、開いまれた行が開く。が開いく。 “zc” を理解するのに、押すと、カーソルすと、コールツリーがカーソル のソースコードある行が開く。が畳んだり、開いまれる
  8. 8 / 14 VIM fold 機能を使う(続き)を実際に見てみる使う(続き)う(続き)続き)き) じつは理屈はわかって VIM のソースコード fold

    機能を使うは理屈はわかって、コールツリーが検索と、折り畳みをと、コールツリーが折り畳みを開く機り畳んだり、開いみを理解するのに、開いく機能を使う が同時に使える。これに使いどころえる。これが超便利という。 +main() +hoge() +fuga() /foo +main() hoge() /*{{{*/ { foo() } /*}}}*/ fuga() /*{{{*/ { foo() } /*}}}*/ “/ 正規表現”はは理屈はわかって VIM のソースコード検索と、折り畳みを で囲まれたブロッあるが、コールツリーが発見ると、量が膨大された文字列 が折り畳みを開く機り畳んだり、開いまれた場所にあっにあっ た場合は、含まれる折は理屈はわかって、コールツリーが含まれる折り畳まれる折り畳みを開く機り畳んだり、開い みが開いき、コールツリーが表示される。される。
  9. 9 / 14 VIM は大きなファイル大きなファイルにきなファイルにも強ファイルに見てみるとも強い強いい コールツリーは理屈はわかって、コールツリーが巨大すぎて概要把握なファイル(数百数百 MBytes 以上 ) になることが多い。いプログラムのソ。

      VIM は理屈はわかって、コールツリーが 500MBytes のソースコードテキストファイルも、コールツリーが昨今ののソースコード ノート PC ぐらいプログラムのソのソースコードリソースがあれば、コールツリーがサクを、畳んだり、サクを、畳んだり、開いいプログラムのソて閲 覧が可能!が可能を使う! SSD と数 GBytes のソースコードメモリがあれば十分!
  10. 10 / 14 VIM のソースコード Goto File 機能を使うも便利という VIM は理屈はわかって、コールツリーがカーソル下にある一連の文にある一連の文字列と行番のソースコード文字列と行が開く。番号をみを理解するのに、み

    て、コールツリーがファイルを理解するのに、オープンし、該当の行番し、コールツリーが該当の行番号へジャのソースコード行が開く。番号をみへジャンプすジャンし、該当の行番プす る Goto File といプログラムのソう機能を使うがある。これもコールツリー 読むのにみに最高! 具体例: VIM にて、コールツリーが /usr/lib/python3/dist-packages/scrapy/ cmdline.py:98 といプログラムのソう行が開く。にカーソルを理解するのに、合は、含まれる折わせ、コールツリーが”は <Ctrl-w>Ctrl-w>gF”>gF”gF” する と、コールツリーが cmdline.py がタブで囲まれたブロッ開いき、コールツリーが 93 行が開く。目にカーソルにカーソル が飛ぶ。ぶ。
  11. 11 / 14 tinycalltrace といプログラムのソうわけで囲まれたブロッ、コールツリーが VIM と相性の良いコールツのソースコード良いコールツリーいプログラムのソコールツリー生成を行うを理解するのに、行が開く。う python3 向けのトレーサをけのソースコードトレーサを理解するのに、作ってって pipy

    に公開いしてみ た。 使いどころいプログラムのソ方:   pip install tinycalltrace 解するのに、コー析したいプログラしたいプログラムのソプログラムのソースコード中にて:にて:   from tinycalltrace import TinyCallTrace if __name__ == ‘__main__’: TinyCallTrace() として、コールツリーが python3 で囲まれたブロップログラムのソースコードを理解するのに、実は理屈はわかっ行が開く。するだけ。
  12. 12 / 14 tinycalltrace (数百つづき) 実は理屈はわかっ行が開く。すると、コールツリーが trace-0xXXXXXXX.txt (XXXXX は理屈はわかってス レッド

    ID を理解するのに、 16 進数にしたものソースコード)が、コールツリーがカレンし、該当の行番トディレクを、畳んだり、ト リに生成を行うされる。これが得られたコールツられたコールツリー。 あとは理屈はわかって、コールツリーが vim trace-0xXXXXXX.txt して、コールツリーが set foldmethod=marker すれば OK! あとは理屈はわかって、コールツリーが適当の行番号へジャに”は zo”,”zc”,”<Ctrl-w>CTRL- w>gF”>gF”gF”,”/ 探したい文字列”したいプログラムのソ文字列”はとかしてみてね! きっと便利というさがわかる!
  13. 13 / 14 trace-0xXXXXX.txt フォーマットは理屈はわかって次のとおり。のソースコードとおり。 • ->gF”run: /usr/lib/python3.6/threading.py:853 from /usr/lib/python3.6/threading.py:916

    {{{ 呼び出された関数び出された関数名出された関数名 関数のソースコード定義のあるのソースコードある ソースのソースコード箇所にあっ 関数を理解するのに、呼び出された関数び出された関数名出した ソースのソースコード箇所にあっ
  14. 14 / 14 おわりに コールツリーと、コールツリーが VIM のソースコード組み合わせは最高み合は、含まれる折わせは理屈はわかって最高 で囲まれたブロッす!大すぎて概要把握きなプログラムのソースコードのソースコードソース解するのに、コー析したいプログラに使いどころっ てみることを理解するのに、是非おすすめ!おすすめ!