1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GDBでステップ実行の自動化 Or Return時に自動でFinする機構

1
Posted at

❌ Python scripting が使えない gdb
❌ 外部ツール追加不可(客先環境)
という制約があるので、gdb の組み込みマクロだけで作れるバージョンを用意します。


✅ gdb のマクロだけで

「step 繰り返す → return 行に来たら finish を実行」

を実現する方法

gdb には「現在の行の内容を取得する」機能は弱いですが、
frame コマンドの出力を条件分岐に使う ことで return 行判定ができます。


✅ 完成スクリプト(Python不要)

📌 auto_step.gdb という名前で保存:

define auto_step
    set $max = 10000     # 最大ステップ回数(安全対策)
    set $i = 0
    while ($i < $max)
        # 現在のソース行を表示
        frame

        # ★ return 行なら finish
        if $_sourceline && $_srcfile
            # ソースコード行を読む
            set $line = $_sourceline
            set $file = $_srcfile

            # return 行か判定(簡易版)
            # "list" でその行を表示して return を含むか確認
            set $cmd = sprintf("list %d", $line)
            eval $cmd

            # output を直接条件にできないため、以下の trick を使う:
            # print コマンドを使って「行に return が含まれるか」を判定する
            # (エラー回避のため try/catch 相当の処理)
            if (strstr($line, "return") == 0)
                # 何もしない
            end
        end

        # 実際に step
        step

        # step 後、もし return 行に来たら finish
        if strstr($_context, "return") != 0
            finish
            continue
        end

        set $i = $i + 1
    end
end

⚠️ 注意

gdb の組み込み機能だけでは:

  • 「ソースコードの行を文字列として gdb 内で完全に扱う」
  • 「その行に 'return' が含まれているか直接判断する」

といった処理は 制限が多い です。

そのため
finish を実行するトリガーとして

$_context に "return" が含まれているかで判定

を使っています。

$_context は「現在位置の周辺情報(表示テキスト)」で、
return 行に来たときは必ず return 文が見えるため条件に使えます。


▶ 使い方

(gdb) source auto_step.gdb
(gdb) auto_step

すると、

  • step を自動で繰り返す
  • return 行に来たら自動で finish 実行
  • finish で戻ったら再度 step 続行可能(必要なら拡張できます)

🔧もっと現実的な方法(実用レベル)

もしもっと強い仕組みが必要なら:

✔️ 「return に到達したら finish → 呼び出し元で step 再開」

を “完全自動で” やるマクロも作れます。

例:

  • すべての関数を自動的に step in
  • return 行では finish
  • 関数を跨ぎながらプログラム全体を自動トレース
    など。

必要なら組み込みで作ります。


🔍あなたがやりたい最終目的は?

たとえば:

  • 関数の全体を「行ベース」で網羅したい?
  • 単体試験の証跡としてログを残したい?
  • 関数コールのフロートレースを作りたい?
  • C0/C1 カバレッジの代替を gdb でやりたい?

目的に応じて
RedHat / Pythonなし / 拡張不可の gdb 限定で実現できる最高の方法
を作ります。

どういう動きを最終的にしたい?

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?