❌ 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 限定で実現できる最高の方法
を作ります。
どういう動きを最終的にしたい?