Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
VIMでコールツリーを読む
Search
nzzy
July 07, 2018
Programming
840
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
VIMでコールツリーを読む
VIMでコールツリーを読むのは最高!という話
nzzy
July 07, 2018
More Decks by nzzy
See All by nzzy
FOSDEM2017行ってきた
tknozzy
0
300
Other Decks in Programming
See All in Programming
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
940
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
2
500
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
570
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
380
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
580
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
860
初めてのKubernetes 本番運用でハマった話
oku053
0
130
継続モナドとリアクティブプログラミング
yukikurage
3
600
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
180
関数型プログラミングのメリットって何だろう?
wanko_it
0
180
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
130
Featured
See All Featured
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
190
Odyssey Design
rkendrick25
PRO
2
730
How GitHub (no longer) Works
holman
316
150k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Evolving SEO for Evolving Search Engines
ryanjones
0
240
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.6k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
300
It's Worth the Effort
3n
188
29k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
290
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1k
Transcript
1 / 14 VIM でコールツリーをコールツリーを読む読むむ nzzy
2 / 14 コールツリー解析とと VIM 設計がわからないプがわからないプログラムのソプログラムのソースコードのソースコードソースコード を理解するのに、理解するのに、コーするのソースコードに、コールツリーがコールツリーが便利というといプログラムのソう 事と、読むのにと、コールツリーが読むのにむのソースコードに VIM が超便利というだったといプログラムのソう
件の紹介をしますのソースコード紹介をします!を理解するのに、します!
3 / 14 コールツリーとは • プログラムにて、関数がどにて、関数がどのよう関数がどのように呼がどのように呼ばれたかを記ばれたかを記記 録したもの。したもの。 test.py の例: import
sys def barbar(): ... def bar(): barbar() def foo(): bar() if __name__ == ‘__main__’: foo() コールツリー: foo() bar() barbar()
4 / 14 コールツリーのソースコード使いどころいプログラムのソどころ • ソースコード読んでも動作が読んでも動作がわんでも動作がわかりにくいがわかりにくい場合、対場合、関数がどのよう対 象のプログラムをのプログラムにて、関数がどを記実際に動作させて、に動作がわかりにくいさせて、関数がどのようコールツリー を記記録したもの。し、関数がどのよう動作がわかりにくいを記掴む。む。 動作がわかりにくいがわかりにくい場合、対例: ・〜ド読んでも動作がリブンでかつ独自アーでかつ独自アーキテク独自アーキテクチャアーキテクチャなプログなプログプログ
ラムにて、関数がど ・抽象のプログラムを化の塊なプログラの塊なプログラムなプログプログラムにて、関数がど ・その他、関数がどのよう設計ポリシーが全くポリシーが全く不明なプログく不明なプログラムなプログプログラムにて、関数がど (笑)己の知識不笑)己の知識不足も含の知識不足も含む(笑)も含む(笑)む(笑)己の知識不笑)
5 / 14 コールツリーの理解の仕方のコ理解の仕方のコツの理解の仕方のコ仕方のコツの理解の仕方のココツ コールツリーの上位だけでプログラだけでプログラムにて、関数がどの流れの概要れの概要 を記つ独自アーキテクかみ、関数がどのよう詳細を知りたい場所を記知りたい場合、対場所の呼び出しをたの呼ばれたかを記び出しをたどっ出しをたどっしを記たどっ て、関数がどのよう詳細を知りたい場所を記把握していくのがコしてい場合、対くのがコツ。 コールツリー 上位だけでプログラの流れの概要れ: foo()
bar() barbar() exit() bar() の内部のの コールの流れの概要れ: hoge() fuga() fugafuga() 概要を記掴む。む 詳細を知りたい場所を記読んでも動作がわんでい場合、対く
6 / 14 コールツリーを実際に見てみる実際に見てみるとに見てみると見てみるとてみると 実は理屈はわかっは理屈はわかって理屈はわかってもは理屈はわかってわかっても ... 現実は理屈はわかっに出力されるコールされるコール ツリーを理解するのに、見ると、量が膨大ると、コールツリーが量が膨大すぎて概が膨大すぎて概要把握すぎて概要把握もままなもままな らないプログラムのソ事と、読むのにがわかると思います。いプログラムのソます。 なにかツールを理解するのに、使いどころえばなんとかなるかも?
そうだ! VIM があるじゃないプログラムのソか!
7 / 14 VIM fold 機能を使うを理解するのに、使いどころう • “{{{“ 〜” }}}”
で囲まれたブロッ囲まれたブロックまれたブロックを、畳んだり、を理解するのに、、コールツリーが畳んだり、開いんだり、コールツリーが開いいプログラムのソ たりで囲まれたブロッきる機能を使う。 set foldmethod=marker で囲まれたブロッ発動。 main() /* {{{ */ { hoge() fuga() } /*}}}*/ hoge() /*{{{ */ { hogehoge() }/*}}}*/ :set foldmethod=marker +main() +hoge() “zo” を理解するのに、押すと、カーソルすと、コールツリーがカーソル のソースコードある畳んだり、開いまれた行が開く。が開いく。 “zc” を理解するのに、押すと、カーソルすと、コールツリーがカーソル のソースコードある行が開く。が畳んだり、開いまれる
8 / 14 VIM fold 機能を使う(続き)を実際に見てみる使う(続き)う(続き)続き)き) じつは理屈はわかって VIM のソースコード fold
機能を使うは理屈はわかって、コールツリーが検索と、折り畳みをと、コールツリーが折り畳みを開く機り畳んだり、開いみを理解するのに、開いく機能を使う が同時に使える。これに使いどころえる。これが超便利という。 +main() +hoge() +fuga() /foo +main() hoge() /*{{{*/ { foo() } /*}}}*/ fuga() /*{{{*/ { foo() } /*}}}*/ “/ 正規表現”はは理屈はわかって VIM のソースコード検索と、折り畳みを で囲まれたブロッあるが、コールツリーが発見ると、量が膨大された文字列 が折り畳みを開く機り畳んだり、開いまれた場所にあっにあっ た場合は、含まれる折は理屈はわかって、コールツリーが含まれる折り畳まれる折り畳みを開く機り畳んだり、開い みが開いき、コールツリーが表示される。される。
9 / 14 VIM は大きなファイル大きなファイルにきなファイルにも強ファイルに見てみるとも強い強いい コールツリーは理屈はわかって、コールツリーが巨大すぎて概要把握なファイル(数百数百 MBytes 以上 ) になることが多い。いプログラムのソ。
VIM は理屈はわかって、コールツリーが 500MBytes のソースコードテキストファイルも、コールツリーが昨今ののソースコード ノート PC ぐらいプログラムのソのソースコードリソースがあれば、コールツリーがサクを、畳んだり、サクを、畳んだり、開いいプログラムのソて閲 覧が可能!が可能を使う! SSD と数 GBytes のソースコードメモリがあれば十分!
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 / 14 tinycalltrace といプログラムのソうわけで囲まれたブロッ、コールツリーが VIM と相性の良いコールツのソースコード良いコールツリーいプログラムのソコールツリー生成を行うを理解するのに、行が開く。う python3 向けのトレーサをけのソースコードトレーサを理解するのに、作ってって pipy
に公開いしてみ た。 使いどころいプログラムのソ方: pip install tinycalltrace 解するのに、コー析したいプログラしたいプログラムのソプログラムのソースコード中にて:にて: from tinycalltrace import TinyCallTrace if __name__ == ‘__main__’: TinyCallTrace() として、コールツリーが python3 で囲まれたブロップログラムのソースコードを理解するのに、実は理屈はわかっ行が開く。するだけ。
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 / 14 trace-0xXXXXX.txt フォーマットは理屈はわかって次のとおり。のソースコードとおり。 • ->gF”run: /usr/lib/python3.6/threading.py:853 from /usr/lib/python3.6/threading.py:916
{{{ 呼び出された関数び出された関数名出された関数名 関数のソースコード定義のあるのソースコードある ソースのソースコード箇所にあっ 関数を理解するのに、呼び出された関数び出された関数名出した ソースのソースコード箇所にあっ
14 / 14 おわりに コールツリーと、コールツリーが VIM のソースコード組み合わせは最高み合は、含まれる折わせは理屈はわかって最高 で囲まれたブロッす!大すぎて概要把握きなプログラムのソースコードのソースコードソース解するのに、コー析したいプログラに使いどころっ てみることを理解するのに、是非おすすめ!おすすめ!