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
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
150
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
18k
freeeにおけるEvalsの実践例の紹介
freee
PRO
0
110
AIが無かった頃の素敵な出会いの話
codmoninc
1
410
Foundation Models frameworkで画像分析
ryodeveloper
1
610
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
570
SlackアプリとLambdaの 連携を構築した話
pawn_4_s
1
110
琵琶湖の水は止められても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
660
数百円から始めるRuby電子工作
tarosay
0
140
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
470
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
200
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
140
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.7k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
73
41k
Six Lessons from altMBA
skipperchong
29
4.4k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
The Invisible Side of Design
smashingmag
301
52k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
For a Future-Friendly Web
brad_frost
183
10k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
410
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
460
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
200
Accessibility Awareness
sabderemane
1
170
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 のソースコード組み合わせは最高み合は、含まれる折わせは理屈はわかって最高 で囲まれたブロッす!大すぎて概要把握きなプログラムのソースコードのソースコードソース解するのに、コー析したいプログラに使いどころっ てみることを理解するのに、是非おすすめ!おすすめ!