<ul><ul><li>Debug Hacks   </li></ul></ul><ul><ul><li>8/13/'09 </li></ul></ul><ul><ul><li>よしおかひろたか(Debug Hacks著者) </li></ul...
Debug Hacks <ul><li>Debug Hacks -- デバッグを極めるテクニック&ツール </li></ul><ul><li>吉岡 弘隆,大和 一洋,大岩 尚宏,安部 東洋,吉田 俊輔  </li></ul><ul><li>IS...
デバッグ入門 <ul><li>デバッグとは、ソフトウェアの不具合(バグ)を修正するプロセス </li></ul><ul><li>ソフトウェアの不具合を発見するプロセスのことはテストとよぶ </li></ul><ul><li>ソフトウェアの不具合...
トラブルシューティング
バグ <ul><li>ソフトウェアの不具合(仕様との差異) </li></ul><ul><ul><li>テストで発見する </li></ul></ul><ul><ul><li>それ以外で発見される </li></ul></ul><ul><ul>...
バグのパターン <ul><li>正常に終了(バグではない) </li></ul><ul><li>期待する動作をしないで終了 </li></ul><ul><ul><li>期待する出力をしない、クラッシュ、遅い、 </li></ul></ul><u...
デバッグのプロセス <ul><li>問題の再現 </li></ul><ul><ul><li>環境設定 </li></ul></ul><ul><ul><li>ヒアリング </li></ul></ul><ul><li>現象の確認 </li></ul...
デバッグのプロセス <ul><li>バグ修正 </li></ul><ul><li>動作確認 </li></ul><ul><ul><li>バグが直っていることの確認 </li></ul></ul><ul><ul><li>デグレード/エンバグがない...
デバッガを使おう <ul><li>任意の場所にブレークポイントを設定できる。 </li></ul><ul><li>プログラムを変更しなくても、変数の値を確認することができる。 </li></ul><ul><li>プログラムを変更しなくても、変数...
デバッグのプロセス <ul><li>期待しない値を出力して終了というケース </li></ul><ul><ul><li>任意の場所にブレークポイントを設定 </li></ul></ul><ul><ul><li>実行 </li></ul></ul...
GDBの基礎の基礎 <ul><li>Gccでコンパイルする  $gcc -g -Wall -Wallはとっても重要 その他、下記のフラグも -W -Wformat=2 -Wcast-qual -Wcast-align -Wwrite-strin...
GDBの基礎の基礎 <ul><li>起動 </li></ul><ul><li>$gdb 実行ファイル名 </li></ul><ul><li>$gdb -c コアファイル 実行ファイル名 </li></ul><ul><li>emacsから起動する...
GDBの基礎の基礎 <ul><li>ブレークポイントの設定 </li></ul><ul><ul><li>任意の場所で停止する </li></ul></ul><ul><li>break 関数名 </li></ul><ul><li>break 行番...
ブレークポイント <ul><li>設定したブレークポイントの確認 info break </li></ul>
実行 <ul><li>run コマンド </li></ul><ul><li>run 引数 </li></ul><ul><li>main()にブレークポイントを設定してmain()まで実行する </li></ul><ul><ul><li>star...
ブレークしたら <ul><li>どこで停止したか。 backtraceコマンド(btと略す) </li></ul>
変数の表示 <ul><li>print[/フォーマット] 変数 </li></ul><ul><ul><li>`x' 16進数で表示 </li></ul></ul><ul><ul><li>`d' 10進数で表示 </li></ul></ul><u...
アドレスの表示 <ul><li>x[/NFU] アドレス </li></ul><ul><li>N繰り返し回数 </li></ul><ul><li>Fフォーマット </li></ul><ul><li>U単位 </li></ul><ul><ul><...
逆アセンブル <ul><li>disassemble コマンド </li></ul>
実行の再開 <ul><li>ステップ実行 </li></ul><ul><li>continue </li></ul><ul><li>finish/until </li></ul>
ステップ実行 <ul><li>ソースコード一行分実行する </li></ul><ul><li>next </li></ul><ul><ul><li>ソースコード一行分実行し停止する。関数呼び出しの場合、関数を実行後停止する。 </li></ul...
continue <ul><li>実行を再開する </li></ul><ul><ul><li>ブレークポイントで停止する </li></ul></ul><ul><ul><li>実行を終了する </li></ul></ul>
finish/until <ul><li>finish 関数を最後まで実行 </li></ul><ul><ul><li>関数の入り口でいろいろ調べた後、最後まで一気に実行したいとき便利 </li></ul></ul><ul><li>until ...
実行の再開のまとめ <ul><li>next/step </li></ul><ul><li>continue </li></ul><ul><li>finish/until </li></ul>
変数へ代入されたとき止めたい <ul><li>ウォッチポイント。任意の変数に代入された時に停止する。 </li></ul><ul><li>watch 式(式が変更された時に停止) </li></ul><ul><li>awatch 式(式が参照、...
その他のブレークポイント <ul><li>ハードウェアブレークポイント(hbreak) </li></ul><ul><li>一時ブレークポイント(tbreak) </li></ul>
変数の値の変更 <ul><li>set variable 変数=式 </li></ul><ul><li>ソースコードを変更する前に試行錯誤して確認できる。 </li></ul>
その他のコマンド <ul><li>info threads </li></ul><ul><li>thread </li></ul><ul><li>info registers </li></ul><ul><li>frame </li></ul>
期待しない値のケースのまとめ <ul><li>任意の場所にブレークポイントを設定 </li></ul><ul><li>実行開始 </li></ul><ul><li>停止したら値の確認 </li></ul><ul><li>実行の再開 </li><...
終了しない場合 <ul><li>無限ループ、デッドロックなどで終了しない場合のデバッグ </li></ul><ul><li>当該プロセスのプロセスIDを調べる $ ps aux|grep プログラム名 </li></ul><ul><li>プロセ...
コアファイルがある場合 <ul><li>$gdb -c コアファイル プログラム名 </li></ul><ul><li>コアファイルを生成した時点でのスタックトレースなどが見れる </li></ul>
まとめ <ul><li>GDBの基本の基本を紹介した </li></ul><ul><li>GDBは便利な機能満載なので使ってみよう </li></ul><ul><li>Debug Hacksの感想、コメント、誤植の発見などなど、著者(hyosh...
付録:Debug Tools <ul><li>kprobes </li></ul><ul><li>jprobes </li></ul><ul><li>KAHO </li></ul><ul><li>systemtap </li></ul><ul>...
kprobes <ul><li>任意のアドレスにプローブを挿入 </li></ul><ul><li>Debug Hacks, #47, #49, #50 </li></ul>
jprobes <ul><li>関数の先頭にプローブを設定することに特化しているので、kprobesよりもお手軽 </li></ul><ul><li>Debug Hacks, #48 </li></ul>
KAHO <ul><li>プロセスの関数を置き換えることができる </li></ul><ul><li>Debug Hacks, #51 </li></ul>
systemtap <ul><li>kprobesを利用して、独自のスクリプト言語を用いてプローブハンドラを作成する。 </li></ul><ul><li>Debug Hacks, #52, #53 </li></ul>
VMware Vprobe <ul><li>ゲストOSの状態を調査することができる </li></ul><ul><li>Debug Hacks, #61 </li></ul>
crash <ul><li>kernel crash dump utility </li></ul><ul><li>Debug Hacks, #21 </li></ul>
gdb <ul><li>デバッガー </li></ul><ul><li>Debug Hacks, #5, #6, #7 </li></ul>
参考文献 <ul><li>Intel® 64 and IA-32 Architectures Software Developer's Manuals http://www.intel.com/products/processor/manual...
Upcoming SlideShare
Loading in …5
×

Programming camp Debug Hacks

1,060 views

Published on

セキュリティ&プログラミングキャンプ2009、
Debug Hacks

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,060
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Programming camp Debug Hacks

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

×