Más contenido relacionado
La actualidad más candente (20)
Similar a Programming camp 2010 debug hacks (20)
Más de Hiro Yoshioka (20)
Programming camp 2010 debug hacks
- 1. Debug Hacks
8/13/'10
よしおかひろたか (Debug Hacks 著者 )
hyoshiok@gmail.com
http://d.hatena.ne.jp/hyoshiok/
http://blog.miraclelinux.com/yume/
- 2. Debug Hacks
● Debug Hacks --
デバッグを極めるテク
ニック & ツール
● 吉岡 弘隆 , 大和 一洋 , 大
岩 尚宏 , 安部 東洋 , 吉田
俊輔
● ISBN:978-4-87311-
404-0
● オライリー・ジャパン
● 2009 年 4 月 22 日
- 3. デバッグ入門
● デバッグとは、ソフトウェアの不具合(バグ)
を修正するプロセス
● ソフトウェアの不具合を発見するプロセスのこ
とはテストとよぶ
● ソフトウェアの不具合を修正するのではなく回
避する方法をトラブルシューティングとよぶ
● Debug Hacks は主に(狭義の)デバッグにつ
いて解説した書籍
- 5. バグ
● ソフトウェアの不具合(仕様との差異)
– テストで発見する
– それ以外で発見される
● たまたま使っていて発見、…
- 6. バグのパターン
● 正常に終了(バグではない)
● 期待する動作をしないで終了
– 期待する出力をしない、クラッシュ、遅い、
● 終了しない
– デッドロック、無限ループ、
- 7. デバッグのプロセス
● 問題の再現
– 環境設定
– ヒアリング
● 現象の確認
● 問題の理解、解析
● 原因が不明?
– 過去にあった同様の問題を検索(バグ DB など)
– バグ発生へ、そなえる
– 同僚に説明する
– コミュニティへ質問する
- 8. デバッグのプロセス
● バグ修正
● 動作確認
– バグが直っていることの確認
– デグレード/エンバグがないことの確認
(リグレッションテストの実行)
● ピアレビュー
● テストプログラムの作成
● コミュニティへの報告(必要であれば)
- 9. デバッガを使おう
● 任意の場所にブレークポイントを設定できる。
● プログラムを変更しなくても、変数の値を確認
することができる。
● プログラムを変更しなくても、変数に任意の値
を設定できる。
● 変数に値が代入されたときに停止することがで
きる。
● コールグラフ(バックトレース)を表示でき
る。
● printf() デバッグださいよね。
- 10. デバッグのプロセス
● 期待しない値を出力して終了というケース
– 任意の場所にブレークポイントを設定
– 実行
– 任意の変数の値を確認(期待通りか)
● 期待通りじゃない場合は、実行前半部分にバグ?
● 期待通りの場合は、実行後半にバグ?
● 終了しないケースは後述
- 11. GDB の基礎の基礎
● Gcc でコンパイルする
$gcc -g -Wall
-Wall はとっても重要
その他、下記のフラグも
-W -Wformat=2 -Wcast-qual -Wcast-align
-Wwrite-strings -Wconversion -Wfloat-
equal -Wpointer-arith
● Makefile では CFLAGS にオプションを追加
● INSTALL や README ファイルなどを確認
- 12. GDB の基礎の基礎
● 起動
● $gdb 実行ファイル名
● $gdb -c コアファイル 実行ファイル名
● emacs から起動するときは、 M-x gdb
- 13. GDB の基礎の基礎
● ブレークポイントの設定
– 任意の場所で停止する
● break 関数名
● break 行番号
● break ファイル名:行番号
● break ファイル名:関数名
● break [+|-] オフセット
● break * アドレス
- 15. 実行
● run コマンド
● run 引数
● main() にブレークポイントを設定して main()
まで実行する
– start コマンド
- 16. ブレークしたら
● どこで停止したか。
backtrace コマンド (bt と略す )
- 17. 変数の表示
● print[/ フォーマット ] 変数
– `x' 16 進数で表示
– `d' 10 進数で表示
– `u' 符号なしの 10 進数で表示
– `o' 8 進数で表示
– `t' 2 進数で表示。 `t' は "two" からくる。
– `a' アドレス
– `c' 文字 (ASCII) として表示
– `f' 浮動小数点
– `s' 文字列として表示
- 18. アドレスの表示
● x[/NFU] アドレス
● N 繰り返し回数
● F フォーマット
● U 単位
– `b' バイト
– `h' ハーフバイト( 2 バイト)
– `w' ワード( 4 バイト) デフォルト
– `g' ジャイアントバイト (8 バイト)
- 20. 実行の再開
● ステップ実行
● continue
● finish/until
- 21. ステップ実行
● ソースコード一行分実行する
● next
– ソースコード一行分実行し停止する。関数呼び出し
の場合、関数を実行後停止する。
● step
– ソースコード一行分実行し停止する。関数呼び出し
の場合、その関数の最初の実行文を実行し停止す
る。(もぐって行く)
- 23. finish/until
● finish 関数を最後まで実行
– 関数の入り口でいろいろ調べた後、最後まで一気に
実行したいとき便利
● until ループが終わるまで実行
– ループの入り口でいろいろ調べた後、ループを一気
に実行したいとき便利
- 25. 変数へ代入されたとき止めたい
● ウォッチポイント。任意の変数に代入された時
に停止する。
● watch 式(式が変更された時に停止)
● awatch 式(式が参照、変更された時に停止)
● rwatch 式(式が参照された時に停止)
● どこであるアドレスが変更されるか、よく分か
らないときなどに利用すると便利。実行速度の
低下がある。
- 27. 変数の値の変更
● set variable 変数 = 式
● ソースコードを変更する前に試行錯誤して確認
できる。
- 28. その他のコマンド
● info threads
● thread
● info registers
● frame
- 29. 期待しない値のケースのまとめ
● 任意の場所にブレークポイントを設定
● 実行開始
● 停止したら値の確認
● 実行の再開
● バグの原因を見つけるまで上記を繰り返す
- 30. 終了しない場合
● 無限ループ、デッドロックなどで終了しない場
合のデバッグ
● 当該プロセスのプロセス ID を調べる
$ ps aux|grep プログラム名
● プロセスへアタッチする
● attach プロセス ID
● アタッチすると実行を停止するので、デバッグ
をはじめる
- 31. コアファイルがある場合
● $gdb -c コアファイル プログラム名
● コアファイルを生成した時点でのスタックト
レースなどが見れる
- 32. まとめ
● GDB の基本の基本を紹介した
● GDB は便利な機能満載なので使ってみよう
● Debug Hacks の感想、コメント、誤植の発見
などなど、著者 (hyoshiok@gmail.com) まで
教えてください。
- 33. 付録: Debug Tools
● kprobes
● jprobes
● KAHO
● systemtap
● VMware Vprobe
● crash
● gdb
- 34. kprobes
● 任意のアドレスにプローブを挿入
● Debug Hacks, #47, #49, #50
- 35. jprobes
● 関数の先頭にプローブを設定することに特化し
ているので、 kprobes よりもお手軽
● Debug Hacks, #48
- 36. KAHO
● プロセスの関数を置き換えることができる
● Debug Hacks, #51
- 37. systemtap
● kprobes を利用して、独自のスクリプト言語を
用いてプローブハンドラを作成する。
● Debug Hacks, #52, #53
- 39. crash
● kernel crash dump utility
● Debug Hacks, #21
- 40. gdb
● デバッガー
● Debug Hacks, #5, #6, #7
- 41. 参考文献
● Intel® 64 and IA-32 Architectures
Software Developer's Manuals
http://www.intel.com/products/processor/manuals/index.htm