セキュリティ&プログラミング    キャンプ2011  ソースコードの読み方   よしおかひろたか     2011年8月11日
講師紹介●   よしおかひろたか、Debug Hacks著者、カーネル    読書会主宰、YLUG(横浜Linux Users Group)、勉    強会勉強会●   未来のいつか/hyoshioの日記    http://d.hatena....
お題●   ソースコードの読み方                 3
プログラマに必要な3つの    スキル●   ソースコードを読むチカラ●   デバッグするチカラ●   テストをするチカラ                   4
3つのスキルをどう身につ    けるか●   学校では教えてくれない●   教科書を読む?●   実際のプロジェクトで経験する?    ●   オープンソースのプロジェクトに参加?●   師匠に弟子入り?    ●   そこでプログラミングキャ...
ソースコードの読み方●   ソースコードって何?●   人間がプログラミング言語などを用い    て記述したもの。    ●   そのままではコンピュータは実行できないので        、通常、コンパイラと呼ばれるソフトウェアで       ...
トラブルシューティングと    ソースコードの読み方●   トラブルシューティングと問題の理解●   実践的なコードの理解                        7
ソースコードを読むチカラ●   プログラマの基礎体力    ●   ソフトウェア開発コストの大部分は保守    ●   不具合修正、改良、機能追加にはコードの理解        が必須●   技術者の付加価値    ●   OSSは深追いできる...
コードの読み方●   なぜ、コードを読むのか●   どのように、読むのか                  9
なぜコードを読むのか?●   仕事だから(目的中心)    ●   トラブルシューティング(不具合修正)    ●   機能修正、機能開発    ●   自己研鑚、勉強●   趣味だから(興味中心)    ●   楽しいから    ●   自己...
なぜコードを読むのか●   目的中心の場合    ●   対象に対する基礎知識は必要    ●   アーキテクチャ        OS、プログラミング言語、RDBMS、…    ●   定番の教科書で知識を得る                 ...
なぜコードを読むのか●   興味中心の場合    ●   人それぞれ、人生いろいろ    ●   無目的でもいいじゃないか    ●   熟読、濫読、積読、黙読、音読、再読、誤読、        精読、速読、耽読、通読、復読、輪読、朗読、   ...
コードの理解について●   モットー:    コードは読むな、    理解しろ〜               13
どのようにコードを理解す    るのか●   個人的な方法を紹介する    ●   唯一あるいはベストな方法というわけでもない    ●   適材適所、もっと良い方法があると思う    ●   公開することによって進化したい(もっと良い    ...
ソースコードを読む視点       微視的理解 巨視的理解静的理解動的理解                     15
理解の仕方、読み方●   静的、動的理解●   微視的、巨視的●   規模の把握●   ツールの利用●   事例                16
静的理解、動的理解●   静的理解    ●   字面での理解●   動的理解    ●   動作による理解                  17
静的、動的構造●   静的構造(デモ)    ●   規模    ●   ディレクトリ構造    ●   名前つけ規約●   動的構造    ●   呼び出し経路    ●   プロファイリング    ●   実行結果             ...
微視的、巨視的●   微視的:細部からの理解    ●   最終的にはコードの一行●   巨視的:全体からの理解    ●   規模、構造、機能など。実行結果(性能?)    ●   俯瞰図、鳥瞰図。                      ...
規模の把握(巨視的理解)●   規模重要    ●   規模(相手)を知らずして作戦を立てられない    ●   大局的な地図、俯瞰図、鳥瞰図    ●   大規模になればなるほど、システマティックな        方法論が必要になってくる  ...
規模の把握●   小規模:100K行未満程度、    ファイル数100未満    10人未満●   中規模:100K行〜1M行程度    ファイル数100〜1000未満    100人未満●   大規模:1M行以上    ファイル数1000以上...
規模の把握(例)●   find -type f -name "*.[ch]"|wc●   find -type f -name "*.[ch]"|xargs wc|grep total      Ruby 1.8.5             ...
ディレクトリ構造●   トップディレクトリは、ソフトウェア    の論理的構造を表している    ●   doc ドキュメント    ●   lib ライブラリ関係    ●   test テスト●   ソースツリーの把握           ...
ドキュメント●   README, INSTALL, COPYING, …●   内部ドキュメント(Docs)●   リリースノート●   ChangeLog                                  24
変更の履歴●   ChangeLog/Release Notes●   コード管理システム    ●   例:Linux git/Subversion/CVS●   Mailing List●   Wiki●   blog●   変更(時間軸)...
ドキュメント、情報収集●   マニュアルを読む●   サーチエンジン(Google)に聞く●   Mailing List●   Bug database●   開発者との会話(シンポジウムなど)●   勉強会                 ...
ソースコードを読む視点       微視的理解 巨視的理解                                 ディ ト 構造、                                   レク リ  名前付け規約静的理解 ...
いよいよコードを読む?●   ツール    ●   エディタ:emacs    ●   デバッガ:gdb    ●   クロスレファレンス:cscope    ●   カーネルの場合、クラッシュダンプ(crash)               ...
デモ、実習●   例題としてrubyを読むことにする。    ●●   GNU Hello    ●   http://savannah.gnu.org/projects/hello                               ...
実習●   ソースコードの規模を理解する●   ディレクトリ構造を理解する●   ビルドする●   ソースコードのナビゲート●   機能変更をする                     30
実習●   ディレクトリ構造を理解する●   ファイル名を眺める●   ファイル数を調べる●   プログラムの行数を調べる                    31
実習●ソースコードの入手    $ git-clone git:// (講師に聞いてください)●   ビルドの準備    READMEをよく読む●   必要なツールを揃える    -   automake <http://www.gnu.org...
実習●   ビルド    $   time git clone ssh:// (講師から情報を得る)    $   cd ruby    $   time autoconf    $   time ./configure    $   time...
●   $ git checkout -b trunk    origin/trunk●   $ autoconf●   ./configure●   make -j4 miniruby                             ...
動的理解●   ビルド           35
動的理解●   ともかく動かす    ●   make    ●   strace    ●   ltrace    ●   gdb    ●   oprofile    ●   リグレッションテスト    ●   ベンチマークテスト     ...
make●   とりあえず、make●   実行環境の構築    ●   gcc -g (デバッグシンボルを付加する)        通常はMakefileのCFLAGSなどに設定    ●   cscopeのインデックスを作成    ●   ...
strace ●   システムコールのトレース$ strace ruby -vexecve("/usr/local/bin/ruby", ["ruby", "-v"], [/* 39 vars */]) = 0uname({sys="Linux...
gdb●   デバッガはコードを理解するためにあ    る    ∴コードを読むために使う●   http://savannah.gnu.org/projects/gdb                                     39
gdbで読むための準備●   gcc -g でコンパイル●   コンパイルしたコードサイズが大きく    なる以外、特に副作用はない●   printfデバッグは有害無益                    40
gdb●   ブレークポイントを設定●   ウオッチポイント(変数の変更)●   run●   止まった時点で    ●   bt スタックフレームの表示    ●   p 変数の表示    ●   c 実行再開、s ステップ実行(関数に潜る)...
oprofile●   プロファイラー    ●   実行時のボトルネックを発見    ●   # opcontrol --start    ●   テストの実行    ●   # opcontrol --stop    ●   # oprep...
oprofileCPU: Core Solo / Duo, speed 2666.77 MHz (estimated)Counted DCACHE_PEND_MISS events (Weighted cycles of L1 miss out...
oprofile●   高速道路で、ズバリ最もコストのか    かっているところに連れて行ってくれ    る●   コードを読まないで、理解する極意                    44
微視的理解●   ひたすらコードを読む●   王道はない●   ↑身もふたもない●   データ構造、変数などに注目し、どこ    で定義され、参照され、代入(変更)    されているかという観点でみる●   デバッガとエディタ、クロスリファレ ...
微視的理解●   $ time find -type f -name     *.[ch] -or -name *.cpp     -or -name *.cxx | xargs     egrep -l hogehoge●   $ time ...
微視的理解●   クロスリファレンスツール    ● 変数の定義(型情報)、変更(代入)、参照●   変数(関数)が、どのように定義されていて、ど    のように参照、変更されているかを追う●   cscope    http://cscope...
実習●   cscopeを利用する    $ time cscope-indexer -r●   emacsを利用する●   gdbを利用する●   oprofileを利用する                               48
ソースコードを読む視点       微視的理解 巨視的理解                                 ディ ト 構造、                                   レク リ  名前付け規約静的理解 ...
参考書●   Linux     ● 詳解LINUXカーネル第三版       ISBN:487311313X     ● Linuxカーネル2.6解読室       ISBN:4797338261●   コードリーディング    ● ISBN...
ユメのチカラ(ブログ)●   http://blog.miraclelinux.com/yume/●   ブックマークで見た人気エントリー●   ソースコードの読み方(524個)    ●   http://blog.miraclelinux....
●   ブログ:ユメのチカラ●   http://blog.miraclelinux.com/yume/●   未来のいつか/hyoshiokの日記●   http://d.hatena.ne.jp/hyoshiok/             ...
Upcoming SlideShare
Loading in …5
×

Code Reading at Security and Programming camp 2011

6,187
-1

Published on

Source Code Reading at Security and Programming camp 2011 by Hiro Yoshioka

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
6,187
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
18
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Code Reading at Security and Programming camp 2011

  1. 1. セキュリティ&プログラミング キャンプ2011 ソースコードの読み方 よしおかひろたか 2011年8月11日
  2. 2. 講師紹介● よしおかひろたか、Debug Hacks著者、カーネル 読書会主宰、YLUG(横浜Linux Users Group)、勉 強会勉強会● 未来のいつか/hyoshioの日記 http://d.hatena.ne.jp/hyoshiok● hyoshiok@gmail.com● http://twitter.com/hyoshiok 2
  3. 3. お題● ソースコードの読み方 3
  4. 4. プログラマに必要な3つの スキル● ソースコードを読むチカラ● デバッグするチカラ● テストをするチカラ 4
  5. 5. 3つのスキルをどう身につ けるか● 学校では教えてくれない● 教科書を読む?● 実際のプロジェクトで経験する? ● オープンソースのプロジェクトに参加?● 師匠に弟子入り? ● そこでプログラミングキャンプだ 5
  6. 6. ソースコードの読み方● ソースコードって何?● 人間がプログラミング言語などを用い て記述したもの。 ● そのままではコンピュータは実行できないので 、通常、コンパイラと呼ばれるソフトウェアで 直接実行できる形式に変換して実行されるか、 インタプリタと呼ばれるソフトウェアで字面を 解釈し実行される。 6
  7. 7. トラブルシューティングと ソースコードの読み方● トラブルシューティングと問題の理解● 実践的なコードの理解 7
  8. 8. ソースコードを読むチカラ● プログラマの基礎体力 ● ソフトウェア開発コストの大部分は保守 ● 不具合修正、改良、機能追加にはコードの理解 が必須● 技術者の付加価値 ● OSSは深追いできる ● 陳腐化しにくい● プロフェッショナルとしての研鑚 ● すぐれた技術者はソースコードを上手に読む 8
  9. 9. コードの読み方● なぜ、コードを読むのか● どのように、読むのか 9
  10. 10. なぜコードを読むのか?● 仕事だから(目的中心) ● トラブルシューティング(不具合修正) ● 機能修正、機能開発 ● 自己研鑚、勉強● 趣味だから(興味中心) ● 楽しいから ● 自己啓発(知的好奇心)● 不純な動機 ● 形から入る 10
  11. 11. なぜコードを読むのか● 目的中心の場合 ● 対象に対する基礎知識は必要 ● アーキテクチャ OS、プログラミング言語、RDBMS、… ● 定番の教科書で知識を得る 11
  12. 12. なぜコードを読むのか● 興味中心の場合 ● 人それぞれ、人生いろいろ ● 無目的でもいいじゃないか ● 熟読、濫読、積読、黙読、音読、再読、誤読、 精読、速読、耽読、通読、復読、輪読、朗読、 輪読、… 12
  13. 13. コードの理解について● モットー: コードは読むな、 理解しろ〜 13
  14. 14. どのようにコードを理解す るのか● 個人的な方法を紹介する ● 唯一あるいはベストな方法というわけでもない ● 適材適所、もっと良い方法があると思う ● 公開することによって進化したい(もっと良い 方法への模索) 14
  15. 15. ソースコードを読む視点 微視的理解 巨視的理解静的理解動的理解 15
  16. 16. 理解の仕方、読み方● 静的、動的理解● 微視的、巨視的● 規模の把握● ツールの利用● 事例 16
  17. 17. 静的理解、動的理解● 静的理解 ● 字面での理解● 動的理解 ● 動作による理解 17
  18. 18. 静的、動的構造● 静的構造(デモ) ● 規模 ● ディレクトリ構造 ● 名前つけ規約● 動的構造 ● 呼び出し経路 ● プロファイリング ● 実行結果 18
  19. 19. 微視的、巨視的● 微視的:細部からの理解 ● 最終的にはコードの一行● 巨視的:全体からの理解 ● 規模、構造、機能など。実行結果(性能?) ● 俯瞰図、鳥瞰図。 19
  20. 20. 規模の把握(巨視的理解)● 規模重要 ● 規模(相手)を知らずして作戦を立てられない ● 大局的な地図、俯瞰図、鳥瞰図 ● 大規模になればなるほど、システマティックな 方法論が必要になってくる ● 巨視的な理解 20
  21. 21. 規模の把握● 小規模:100K行未満程度、 ファイル数100未満 10人未満● 中規模:100K行〜1M行程度 ファイル数100〜1000未満 100人未満● 大規模:1M行以上 ファイル数1000以上 100人以上 ざっくりの規模感 21
  22. 22. 規模の把握(例)● find -type f -name "*.[ch]"|wc● find -type f -name "*.[ch]"|xargs wc|grep total Ruby 1.8.5 257 197767 Linux 2.6.18 16522 680万 MySQL 5.0.24a 1795 988463 22
  23. 23. ディレクトリ構造● トップディレクトリは、ソフトウェア の論理的構造を表している ● doc ドキュメント ● lib ライブラリ関係 ● test テスト● ソースツリーの把握 23
  24. 24. ドキュメント● README, INSTALL, COPYING, …● 内部ドキュメント(Docs)● リリースノート● ChangeLog 24
  25. 25. 変更の履歴● ChangeLog/Release Notes● コード管理システム ● 例:Linux git/Subversion/CVS● Mailing List● Wiki● blog● 変更(時間軸)の微視的理解 25
  26. 26. ドキュメント、情報収集● マニュアルを読む● サーチエンジン(Google)に聞く● Mailing List● Bug database● 開発者との会話(シンポジウムなど)● 勉強会 26
  27. 27. ソースコードを読む視点 微視的理解 巨視的理解 ディ ト 構造、 レク リ 名前付け規約静的理解 ソ ノ ースコ 、 h a n ge Log 、 リ ート ード C リ ース 、規模の把握( など) 行数、 ァ ル数 フ イ動的理解 デバッガによる実行 実行性能、 グレッ ンテスト リ ショ 27
  28. 28. いよいよコードを読む?● ツール ● エディタ:emacs ● デバッガ:gdb ● クロスレファレンス:cscope ● カーネルの場合、クラッシュダンプ(crash) 28
  29. 29. デモ、実習● 例題としてrubyを読むことにする。 ●● GNU Hello ● http://savannah.gnu.org/projects/hello 29
  30. 30. 実習● ソースコードの規模を理解する● ディレクトリ構造を理解する● ビルドする● ソースコードのナビゲート● 機能変更をする 30
  31. 31. 実習● ディレクトリ構造を理解する● ファイル名を眺める● ファイル数を調べる● プログラムの行数を調べる 31
  32. 32. 実習●ソースコードの入手 $ git-clone git:// (講師に聞いてください)● ビルドの準備 READMEをよく読む● 必要なツールを揃える - automake <http://www.gnu.org/software/automake/> - autoconf <http://www.gnu.org/software/autoconf/> - bison <http://www.gnu.org/software/bison/> - gettext <http://www.gnu.org/software/gettext/> - git <http://git.or.cz/> - gperf <http://www.gnu.org/software/gperf/> - gzip <http://www.gnu.org/software/gzip/> - perl <http://www.cpan.org/> - rsync <http://samba.anu.edu.au/rsync/> - tar <http://www.gnu.org/software/tar/> 32
  33. 33. 実習● ビルド $ time git clone ssh:// (講師から情報を得る) $ cd ruby $ time autoconf $ time ./configure $ time make $ time make test 33
  34. 34. ● $ git checkout -b trunk origin/trunk● $ autoconf● ./configure● make -j4 miniruby 34
  35. 35. 動的理解● ビルド 35
  36. 36. 動的理解● ともかく動かす ● make ● strace ● ltrace ● gdb ● oprofile ● リグレッションテスト ● ベンチマークテスト 36
  37. 37. make● とりあえず、make● 実行環境の構築 ● gcc -g (デバッグシンボルを付加する) 通常はMakefileのCFLAGSなどに設定 ● cscopeのインデックスを作成 ● ビルドはemacsのshellなどから行い、ビルドの ログを取得しておくと便利 37
  38. 38. strace ● システムコールのトレース$ strace ruby -vexecve("/usr/local/bin/ruby", ["ruby", "-v"], [/* 39 vars */]) = 0uname({sys="Linux", node="asianux2.miraclelinux.com", ...}) = 0brk(0) = 0x976a000access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or diropen("/etc/ld.so.cache", O_RDONLY) =3fstat64(3, {st_mode=S_IFREG|0644, st_size=89946, ...}) = 0old_mmap(NULL, 89946, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7close(3) =0open("/lib/libdl.so.2", O_RDONLY) =3 38
  39. 39. gdb● デバッガはコードを理解するためにあ る ∴コードを読むために使う● http://savannah.gnu.org/projects/gdb 39
  40. 40. gdbで読むための準備● gcc -g でコンパイル● コンパイルしたコードサイズが大きく なる以外、特に副作用はない● printfデバッグは有害無益 40
  41. 41. gdb● ブレークポイントを設定● ウオッチポイント(変数の変更)● run● 止まった時点で ● bt スタックフレームの表示 ● p 変数の表示 ● c 実行再開、s ステップ実行(関数に潜る)、 n ステップ実行(関数に潜らない)● 繰り返す 41
  42. 42. oprofile● プロファイラー ● 実行時のボトルネックを発見 ● # opcontrol --start ● テストの実行 ● # opcontrol --stop ● # opreport -l● http://oprofile.sourceforge.net/news/ 42
  43. 43. oprofileCPU: Core Solo / Duo, speed 2666.77 MHz (estimated)Counted DCACHE_PEND_MISS events (Weighted cycles of L1 miss outstanding) witha unit mask of 0x00 (Weighted cycles) count 100000 vma samples % linenr info app name symbol name000000000042be50 244787 33.2383 gc.c:1661 ruby os_each_obj 000000000042bfac 1 4.1e-04 gc.c:1599 000000000042bfb9 5 0.0020 gc.c:1599 000000000042bfbe 6 0.0025 gc.c:1599 000000000042bfd0 4862 1.9862 gc.c:1601 000000000042bfd3 228573 93.3763 gc.c:1601 000000000042bfd6 2698 1.1022 gc.c:1601 000000000042bfd8 250 0.1021 ruby.h:672 43
  44. 44. oprofile● 高速道路で、ズバリ最もコストのか かっているところに連れて行ってくれ る● コードを読まないで、理解する極意 44
  45. 45. 微視的理解● ひたすらコードを読む● 王道はない● ↑身もふたもない● データ構造、変数などに注目し、どこ で定義され、参照され、代入(変更) されているかという観点でみる● デバッガとエディタ、クロスリファレ ンスツールを駆使 45
  46. 46. 微視的理解● $ time find -type f -name *.[ch] -or -name *.cpp -or -name *.cxx | xargs egrep -l hogehoge● $ time grep -r –include=*.[ch] hogehoge .● hogehogeを含むファイルを検索 46
  47. 47. 微視的理解● クロスリファレンスツール ● 変数の定義(型情報)、変更(代入)、参照● 変数(関数)が、どのように定義されていて、ど のように参照、変更されているかを追う● cscope http://cscope.sourceforge.net/● lxr http://lxr.linux.no/● GNU GLOBAL http://www.gnu.org/software/global/● ack-grep 47
  48. 48. 実習● cscopeを利用する $ time cscope-indexer -r● emacsを利用する● gdbを利用する● oprofileを利用する 48
  49. 49. ソースコードを読む視点 微視的理解 巨視的理解 ディ ト 構造、 レク リ 名前付け規約静的理解 ソースコ 、 h a n ge Log 、 リ ード C ノ 、 sco p e ート c リ ース 、規模の把握( など) 行数、 ァ ル数 フ イ動的理解 デバッ (g db )による実行、 e ガ strac op ro fie 、 c e 、 ッ ンテスト ショ l stra 実行性能、 グレ リ 49
  50. 50. 参考書● Linux ● 詳解LINUXカーネル第三版 ISBN:487311313X ● Linuxカーネル2.6解読室 ISBN:4797338261● コードリーディング ● ISBN:4839912653● Rubyソースコード完全解説 ● ISBN:4844317210(品切れ中) http://i.loveruby.net/ja/rhg/ 50
  51. 51. ユメのチカラ(ブログ)● http://blog.miraclelinux.com/yume/● ブックマークで見た人気エントリー● ソースコードの読み方(524個) ● http://blog.miraclelinux.com/yume/2007/08/post_d6bd.html● デバッグ方法論(99個) ● http://blog.miraclelinux.com/yume/2007/08/post_d3eb.html● 多くの人に興味がある話題 51
  52. 52. ● ブログ:ユメのチカラ● http://blog.miraclelinux.com/yume/● 未来のいつか/hyoshiokの日記● http://d.hatena.ne.jp/hyoshiok/ 52
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×