- 即売会あり
- 著者の自己紹介
- 5⁄9(土) に新宿ジュンク堂でトークセッション
- 5⁄28(木) にミラクル・リナックスでイベントやるらしい.
- Linux Sypodium の DOF をやりたい.
##まとめと感想
- Cとかメモリ周りの勉強したくなりました.
##あいさつ
- 吉岡さんによる「はじめに」の朗読
- 学生や社会人1年生の時に読みたいと思った内容になっている
##著者によるデバッグネタ ###大和さん
- オライリーメーカーでの失敗談
- strace(#43)の話
- プログラムが実行する system call 一覧を表示する
###大岩さん
- アンケートで本以外のネタの要望が多かった.
- RPMコマンドによるデバッグ
- /var/spool/clientmqueue/ にファイルがどんどんたまる
- いつ誰が作ったかを調べる
# rpm -qf /var/spool/clientmqueue/
sendmail-8.13.8-2AX
- メールに関係するものだと見当がついた.
- ファイルを開くとメールだった.そして logwatch 送信者
# rpm -ql logwatch | grep etc
....
- cron(くろーん)
- /etc/crontab をみると,root 宛にメール送っていたのを修正した.
- スクリプトのデバッグ
- bash -x で,実際に実行したスクリプトを表示してくれる.
- 裏話
- LKMLにパッチ投げて採用された!
###安部さん
- もっぱら print デバッグ派
- でも gdb ネタを持ってきた.
- gdb ネタ
- リストっぽい構造体をダンプする
- ユーザ定義コマンドを定義すれば,ポインタアドレスを入れればきれいに表示できるので,デバッグしやすい!
- 一つ一つやるのは大変.
- debuginfo 付きバイナリのシンボル情報だけ利用する
- debubinfo なしのバイナリで,シンボルだけ別に取得できた場合には使える
- さらに楽な方法は?
- デバッグ関数を追加する
- C でデバッグ用関数を書いて,共有ライブラリにして,ロードする.
###Shimamoto さん
- #30 malloc()/free() で障害
- free()で落ちた?
- backtrace すると確かに free() で落ちている
- ライブラリ関数で落ちていても
- たいていは,アプリケーション側で,2重解放,不正解放などが原因
- デバッグ方法は
- Valgrind / glibc の MALLOCCHECK
###吉田さん
- ネタが Linux Kernel に特化しているので,没ネタ紹介?
- トラブルシューティング Hacks
- なんか突然止まった
- 変更点を探す,が,そこにだけ注目してはいけない.
- 相関関係 != 因果関係
- トラブルを保存する.ダンプとか写真とか.バグ報告に十分な情報かを考える.
- 真の目的をなにかを知る.
- 具体的にいつまでに?
- 最悪のケースとは?
- ストップロス
- 「仕様です.」
- 問題を定義
- 再現性は?
- 再現環境は?
- エラーメッセージは?
- 英語メッセージは?
- 事例調査する
- ググる
- 誰がやるのか?
- 自分以外も候補として
- 助言をもらえるとありがたい人などがいるか?
- 責任と期限が決まったら行動
- 最初は基本的なことから一つずつ調べる
- 事前準備が必要
- 覚悟
- 壊れたら最悪どうするのか
- 状況切り分け
- クリーンインストールして再現したら解析開始
- 再現しなかったら,再現するように環境を近づけていく
- 再現したら,各種ツールと,DEBUG HACKS で解決しよう!
##Little debugging principles(Yugui さん)
- スケールアウト株式会社 / Akasaka.rb
- 先陣を切るから,みんなもっとすごいことしてくれー1
- デバッグするときは
- データの流れを見る
- 今日は Userland の話
- 昔は非同期処理,並列処理で苦労した
- 今日は Ruby
- Debug
- 再現
- ログをとる.重要.
- 特定
- 方法は BDD (RSpec).仕様を満たす最低限のコードだけを書く.
- 仕様の不足や仕様からの逸脱がわかる.
- 修正
- Legacy Code = テストがないコード
- コードを見て,何故必要かを考えて,仕様を記述する
- DbC = Design by Contract (規約によるデザイン)
- デバッグでコードを追いかけるのは敗北
- 負けたときは,what -> who
- what
- gdb -c / attach / 二分探索
- who
- 誰が?
- データの流れを追う
- gdb / シンボル
- Ruby では gdb のために enum があったりする
- それでも負けたときは,力ずくで試行する
###Q&A
- バイナリしかない場合は?
- dis assemble すればいいんじゃないか.
- マクロ多用したものとかは?
- マクロを部分的に適用するプリプロセッサを利用する
- 一番の敗北は?
- Socket と Thread の関係がわからなくあって,ソースを捨てたこと.
- assertion をどれぐらい追加した?
- 早期発見できたので,100ぐらいですんだ.
- 一次キャッシュののりが悪い
- リビジョンを前に戻したら解決した.
- oprofile でキャッシュミスがわかる.(#60?)
- 並列プログラムでデバッグで根性以外に何か方法は?
- 根性です.
- 新しいデバッグ手法のネタ
- TDD/BDD だとデバッグがテストの瞬間にわかるから,いいんじゃないかな?(吉岡さん)
- より色んな種類のものにふれる(安部さん)
- 何が起きてるか見極めてデバッグ.何を見たいのか(島本さん)
- 気合い.そのためにちゃんと寝て食べる.(大和さん)
- 三田さんの fault injection はいいんじゃないのかな?この本を読んだ方からそういう話がでるといいなと思っている(大岩さん)
- 仮想環境の上で動かすとデバッグしやすいんじゃないかな(吉田さん)
- Evil Rubyなどでスクリプト言語からデバッグすればいいのではないか.あと静的解析(?) coverity(?)も. (Yuguiさん)
- それは無理そうなんですが・・・・ [return]