gdbでプログラムを実行しながらバイナリコードを解析する際に使いそうなコマンドをメモ。
適宜ここに追加していく予定。
情報の参照
| コマンド | 内 容 |
|---|---|
| info proc | プロセスの要約情報 |
| info proc mappings | プロセスのマッピング情報 |
| info proc status | プロセスの状態情報 |
| info proc all | プロセスの情報すべて |
| info breakpoints | ブレークポイントの情報 |
ブレークポイント
| コマンド | 内 容 |
|---|---|
| b *(アドレス) | ブレークポイントの設定 例:b *0xaaaaaaac45e0 |
| watch *(アドレス) | 値が変更された場合にブレークするブレークポイントを設定 例:watch *0xaaaaaaaaa000 |
| tb *(アドレス) | プログラムの実行コードのブレークポイント、ただし1回限り |
| rwatch *(アドレス) | 読み込みメモリアクセス時のブレークポイント |
| awatch *(アドレス) | 読み書きメモリアクセス時のブレークポイント |
| catch syscall (関数名) | 特定のシステムコール呼び出し時 |
| delete breakpoints (番号) | 設定されているブレークポイントの削除(番号は"info breakpoints"で表示された番号) |
メモリの参照
値の参照方法
x (アドレスまたはレジスタ)
値の参照方法(フォーマット付き)
x/(フォーマット) (アドレスまたはレジスタ)
フォーマット一覧
| パラメータ | 内 容 |
|---|---|
| 数字 | 繰り返す回数 |
| b | 単一バイト(1バイト) |
| h | 半ワード(2バイト) |
| w | ワード(4バイト) |
| g | 巨大ワード(ダブルワード)(8バイト) |
| x | 符号なし16進数 |
| d | 符号付き10進数 |
| u | 符号なし10進数 |
| o | 符号なし8進数 |
| a | 絶対アドレス、またはシンボルに定義された相対アドレス |
| c | 文字定数 |
| f | 浮動小数点(w、gのみ) |
| s | 文字列 |
| i | 機械語インストラクション |
例:0xa0000000から1バイト単位で16バイト表示する。
x/16b 0xa0000000
例:スタックポインタ以下の値を16ワード表示する。
x/16xw $esp
レジスタの参照
| コマンド | 内 容 |
|---|---|
| info registers | 全てのレジスタの値を参照 ("i r"で省略可能) |
| info register(レジスタ名) | 特定のレジスタの値を参照 ("i r (レジスタ名)"で省略可能) |
| p/x $(レジスタ名) | 特定のレジスタの値を参照(別法) |
逆アセンブルコードの表示
逆アセンブルコードの表示
disassemble (アドレス)
逆アセンブルコードのレイアウト設定
set disassembly-flavor (レイアウト)
レイアウト:
- intel (intel形式)
- att (AT&T形式)
プロセスの実行
| コマンド | 内 容 |
|---|---|
| run | プロセス開始(最初から実行) |
| continue | ブレークポイントからの継続 |
| step | 1ステップ実行(デバッグモードモジュールかつソースとリンク) |
| stepi | ニモニック命令レベルで1ステップ実行 |
| nexti | ニモニック命令レベルで実行(callの場合リターンするまで継続) |
| finish | スタックフレームからリターンするまで継続 |
| until (アドレス) | 指定位置またはスタックフレームからリターンするまで継続 |