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

Debug Hacks at Security and Programming camp 2011

5,429

Published on

Debug Hacks at Security and Programming camp 2011

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

No Downloads
Views
Total Views
5,429
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
10
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Debug Hacks at Security and Programming camp 2011 "

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

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

×