はじめに
SAPの開発・保守に関わると、避けて通れないのがデバッグ作業です。「処理がどこで止まったのか」「変数にどんな値が入っているのか」「なぜこの分岐に入ったのか」――これらの疑問に答えてくれるのがABAPデバッガです。
ところが、デバッガの画面を開いたものの「F7って何?」「ブレークポイントってどう設定するの?」と戸惑う場面は多いです。デバッガは機能が豊富な分、最初のハードルが高く感じられます。
この記事では、デバッガの起動方法からステップ実行・変数操作・応用テクニックまでを体系的に解説します。この記事を一通り読めば、SAPのデバッグ操作を自力で進められるようになることを目標にしています。
この記事で分かること:
- ABAPデバッガの起動方法(/hコマンド、ブレークポイント、エディタからの起動)
- F5 / F6 / F7 / F8 の4つのステップ実行キーの使い分け
- ブレークポイントの種類と設定方法
- 変数値の確認と変更(デバッグ更新)
- ウォッチポイントの活用
- New Debugger と Classic Debugger の違い
- バックグラウンドジョブ・RFC・更新タスクのデバッグ方法
デバッガの起動方法
ABAPデバッガを起動する方法はいくつかあります。状況に応じて使い分けることで、効率的にデバッグを開始できます。
方法1:/h コマンド(最も手軽)
最も簡単で、最も頻繁に使う起動方法がこれです。
- SAP GUIの画面上部にあるコマンドフィールドに
/hと入力してEnterキーを押す - 「デバッグがオンになりました(Debugging switched on)」という確認メッセージが表示される
- その後、画面上の任意のボタンを押すかEnterキーを押すと、デバッガが起動する
トランザクションの実行前でも実行中でも使えるため、「この操作の裏で何が動いているか確認したい」というときにすぐ起動できます。標準トランザクション(自分でソースコードを書いていないプログラム)のデバッグにも使えるのが大きな利点です。
なお、/hs と入力するとシステムデバッグモードで起動します。通常の /h ではスキップされるシステムプログラムの中にも入れるモードです。同時に更新デバッグ(後述)もオンになります。
方法2:ABAPエディタからブレークポイントを設定して実行
SE38(ABAPエディタ)やSE80(オブジェクトナビゲータ)でプログラムのソースコードを開いている場合に使えます。
- ソースコード上でブレークポイントを設定したい行にカーソルを置く
- ツールバーの停止アイコンをクリック、またはショートカット Ctrl+Shift+F12 を押す
- 行の左端に赤いアイコン(停止マーク)が表示される
- プログラムを実行すると、ブレークポイントの位置でデバッガが自動的に起動する
この方法は「このコードのこの行から調べたい」というピンポイントの調査に向いています。
方法3:SE38から直接デバッグ実行
SE38を開き、プログラム名を入力した後、メニューの「プログラム」→「実行」→「デバッグ」を選択すると、プログラムの先頭行からデバッガが起動します。プログラム全体の流れを最初から追いたい場合に使います。
方法4:ソースコード内にブレークポイント文を記述
ABAPコードの中に直接ブレークポイントを記述する方法もあります。開発中のプログラムで、特定のポイントを毎回デバッグしたい場合に便利です。
| 記述方法 | 動作 |
|---|---|
BREAK-POINT. | 全ユーザーに対して停止する。テスト中の一時利用向き |
BREAK username. | 指定したユーザー名でログインしている場合のみ停止 |
BREAK-POINT ID group_name. | チェックポイントグループと連動。トランザクションSAABで有効・無効を切り替え可能 |
注意点として、BREAK-POINT. は全ユーザーに影響するため、本番環境のコードに残すのは厳禁です。開発・テスト環境でのみ使用し、不要になったら必ず削除してください。
flowchart LR
subgraph 手軽["手軽な起動"]
A["/h コマンド\n画面から即起動"]
end
subgraph エディタ["エディタから起動"]
B["SE38 / SE80\nブレークポイント設定"]
C["SE38\nデバッグ実行"]
end
subgraph コード["コード内記述"]
D["BREAK-POINT.\nソースに直接記述"]
end
A -->|"最も一般的"| E["デバッガ起動"]
B --> E
C --> E
D --> Eステップ実行の4つのキー(F5 / F6 / F7 / F8)
デバッガを起動したら、コードを1行ずつ実行しながら動きを追跡していきます。このとき使うのが F5 〜 F8 の4つのキーです。この4つの使い分けがデバッグの基本中の基本なので、確実に押さえてください。
| キー | 機能名 | 動作 | いつ使うか |
|---|---|---|---|
| F5 | ステップイン(Single Step) | 現在の行を実行して次の行へ進む。サブルーチン・関数モジュール・メソッドの中にも入る | 処理の中身を詳しく追いたいとき |
| F6 | ステップオーバー(Execute) | 現在の行を実行するが、サブルーチン等の内部には入らず、結果だけ得て次の行へ進む | 中身に興味がない処理を飛ばしたいとき |
| F7 | リターン(Return) | 現在のサブルーチン/関数モジュールの残りを一気に実行し、呼び出し元の次の行に戻る | 今いるサブルーチンの調査が終わり、呼び出し元に戻りたいとき |
| F8 | 続行(Continue) | 次のブレークポイントまで、またはプログラムの終了まで実行を継続する | 途中の処理をスキップして次のブレークポイントまで一気に進みたいとき |
具体的な使い分けの例
たとえば、あるプログラムが以下の流れで動いていたとします。
メインプログラム
└─ PERFORM sub_routine_1(サブルーチン1を呼び出し)
└─ CALL FUNCTION 'BAPI_PO_CREATE'(購買発注を作成するBAPI)
└─ PERFORM sub_routine_2(サブルーチン2を呼び出し)
- sub_routine_1 の中身を見たい → PERFORM の行で F5 を押すとサブルーチンの中に入る
- BAPI の中身には興味がない → CALL FUNCTION の行で F6 を押すと、BAPIの実行結果だけ受け取って次の行に進む
- sub_routine_1 の調査が終わった → F7 を押すとサブルーチンから抜けてメインプログラムに戻る
- sub_routine_2 には用がない → F8 を押すと次のブレークポイント(または終了)まで一気に進む
その他のショートカット
| キー | 機能 | 説明 |
|---|---|---|
| Shift+F8 | カーソルまで続行 | カーソルを置いた行まで実行を継続する。間のコードは実行される |
| Shift+F12 | 文へジャンプ(Goto Statement) | カーソル位置の行までジャンプする。間のコードは実行されずスキップされる。New Debugger専用 |
Shift+F8 と Shift+F12 は似ているようで大きく異なります。Shift+F8 は間のコードを実行する、Shift+F12 は間のコードをスキップするという違いです。Shift+F12(Goto Statement)はテスト中に特定の条件分岐を飛ばしたい場合などに使いますが、スキップした部分の処理は行われないため注意が必要です。
ブレークポイントの種類と設定方法
ブレークポイントとは「プログラムのこの地点で一旦停止してほしい」とデバッガに伝えるマーカーです。適切なブレークポイントの設定が、効率的なデバッグの鍵になります。
セッションブレークポイント
最も基本的なブレークポイントです。ABAPエディタまたはデバッガの画面で設定します。
- 設定方法:エディタ上で対象行にカーソルを置き、Ctrl+Shift+F12
- 有効範囲:現在のユーザーセッション内の全ABAPセッション
- 消滅条件:ログオフすると消える
通常のデバッグでは、このセッションブレークポイントを使うのが最も一般的です。
外部ブレークポイント
RFC(Remote Function Call)やHTTP経由で呼び出される処理をデバッグする場合に使います。
- 設定方法:Ctrl+Shift+F9
- 有効範囲:セッション終了後も、他のユーザーセッションからの呼び出しに対して有効
- 消滅条件:設定後2時間で自動的に無効化
- 用途:RFC処理、ICF(Internet Communication Framework)処理のデバッグに適している
外部ブレークポイントは他のユーザー向けにも設定できます(ユーティリティ → 設定 → ABAPエディタタブ → デバッグ → ユーザー名を指定)。
条件付きブレークポイント
ブレークポイントに条件を追加し、条件を満たした場合だけ停止させることができます。
たとえば、ループ処理の中で「SY-INDEX(ループカウンタ)が100を超えたときだけ停止したい」という場合に使います。
- ブレークポイントを通常どおり設定する
- ブレークポイント一覧で対象を選択し、Conditionフィールドに条件(例:
sy-index > 100)を入力する
大量のループを回す処理のデバッグでは、条件なしで設定すると毎回のイテレーションで停止してしまい非効率です。条件付きブレークポイントを活用すれば、調査対象のタイミングだけに絞って止められます。
メッセージブレークポイント
「画面にエラーメッセージが表示されるけれど、プログラムのどこで発生しているかわからない」という場面で威力を発揮します。
デバッガのブレークポイント設定画面で、メッセージクラスとメッセージ番号を指定します。指定したメッセージが発行される直前でデバッガが停止するため、エラー原因の特定に非常に有効です。
文ブレークポイント(Statement Breakpoints)
特定のABAP文(SELECT、CALL FUNCTION、MESSAGE など)が実行される全ての箇所で停止させます。「このプログラムのどこでSELECT文が実行されているか」を網羅的に調べたいときに使えます。
変数の確認と変更
デバッグの中核となる操作が、変数値の確認と変更です。
変数値の確認方法
デバッガ画面では、いくつかの方法で変数の値を確認できます。
| 方法 | 操作 |
|---|---|
| ダブルクリック | ソースコード中の変数名をダブルクリックすると、変数表示領域に値が表示される |
| Variables タブ | Variables 1 / Variables 2 タブで変数名を手入力して監視 |
| Locals タブ | 現在のスコープ内のローカル変数を一覧表示 |
| Globals タブ | グローバル変数を一覧表示 |
日常的に使うのはダブルクリックです。コードを読みながら「この変数の中身は何だろう」と思った瞬間にダブルクリックすれば即座に値を確認できます。
一方、複数の変数を同時に監視したいときは Variables タブが便利です。変数名を入力しておけば、ステップ実行のたびに最新の値が表示されます。
変数値の変更(デバッグ更新)
デバッグ中に変数の値を書き換えることができます。これを「デバッグ更新」と呼びます。テスト中に特定の条件を擬似的に作り出すのに使う強力な機能です。
操作手順:
- 変更したい変数の値の横にある鉛筆アイコンをダブルクリックする
- フィールドが編集可能になり、鉛筆アイコンがメガネアイコンに変わる
- 新しい値を入力する
- Enterキーで変更を確定する
活用例:
- SY-SUBRC(リターンコード)を 0 に変更して、エラー分岐を回避する
- 変数の値を変えて、IF文の別の分岐に入る動作を確認する
- 内部テーブルのレコードを変更して、特定の条件下での動作をテストする
注意事項:
- 構造体(Structure)の場合、構造体レベルでは変更できません。ダブルクリックでコンポーネントレベルまでドリルダウンしてから変更します
- 定数(CONSTANTS で定義された値)は変更できません
- 変数値の変更には S_DEVELOP または S_DBG 権限オブジェクトの適切な権限が必要です。権限がない場合は値を参照できても変更はできません
- 本番環境での変数変更は、データ不整合を引き起こす可能性があるため極めて慎重に行う必要があります
ウォッチポイント
ウォッチポイントは「特定の変数の値が変化した瞬間に停止する」機能です。ブレークポイントが「特定の行で止める」のに対し、ウォッチポイントは「特定の変数が変わったときに止める」という違いがあります。
どんなときに使うか
「グローバル変数の値がいつの間にか書き換わっているが、プログラムのどこで変わったのかわからない」という場面で威力を発揮します。ウォッチポイントを設定すれば、その変数に値が代入された瞬間にデバッガが停止し、変更前後の値(旧値・新値)が表示されます。
設定方法
- デバッガのツールバーでウォッチポイントボタンをクリックする
- 監視したい変数名を指定する
- 必要に応じて条件を追加する(例:変数の値が特定の値になったときだけ停止)
条件付きウォッチポイント
条件を組み合わせることも可能です。たとえば「内部テーブルの行数が100を超えたときだけ停止」のような設定ができます。New Debugger では、内部テーブルやオブジェクト属性に対するウォッチポイントも設定可能です(Classic Debugger では内部テーブルは不可)。
New Debugger と Classic Debugger
SAP NetWeaver 7.0 EHP2 以降では、従来の Classic Debugger に加えて New Debugger が利用できます。現在の主流は New Debugger です。
アーキテクチャの違い
| 比較項目 | Classic Debugger | New Debugger |
|---|---|---|
| 実行方式 | アプリケーションと同じプロセスで動作 | 独立した別ウィンドウで動作 |
| 画面 | アプリケーション画面と同じウィンドウに表示 | 専用のデバッガウィンドウが開く |
| カスタマイズ | 固定レイアウト | 12個のデスクトップに最大4ツールを自由配置 |
機能の違い
New Debugger では Classic Debugger にはない以下の機能が使えます。
| 機能 | 説明 |
|---|---|
| 内部テーブルへのウォッチポイント | テーブルのレコード数変化を監視できる |
| Goto Statement(Shift+F12) | カーソル位置へジャンプ(間のコードはスキップ) |
| デバッガスクリプティング | ABAPでデバッグ操作を自動化できる |
| Diff ツール | 2つの変数(テーブル・構造体・文字列)の差分を比較 |
| レイヤ認識デバッグ | 拡張やBAdI実装をレイヤ単位で追跡 |
特に理由がなければ New Debugger を使用することを推奨します。
切り替え方法:メニューの「設定(Settings)」→「ABAPエディタ」→「デバッグ」→「New Debugger」を選択します。
デバッガの主なツール/タブ
New Debugger では、複数のツールを自由に配置して使えます。主なツールを紹介します。
| ツール名 | 用途 |
|---|---|
| Source Code | 現在実行中のソースコードを表示。行クリックでブレークポイント設定 |
| Variables | 変数値の表示・監視(Variables 1 / Variables 2 の2タブ) |
| Table Tool | 内部テーブルの内容を表示・編集 |
| Call Stack | 関数・サブルーチン・メソッドの呼び出し履歴を表示 |
| Breakpoints | 設定済みブレークポイントの一覧管理 |
| Watchpoints | ウォッチポイントの管理 |
| Locals / Globals | ローカル変数・グローバル変数の一覧表示 |
| Object Tool | オブジェクト参照(TYPE REF TO)の中身をブラウズ |
| Diff Tool | 2つの変数の型と値の差分を比較 |
実務では Source Code + Variables + Call Stack の3つを常時表示しておくのが効率的です。New Debugger ならデスクトップにこの3つを並べて配置できます。
特殊シナリオのデバッグ
通常のオンライントランザクションだけでなく、バックグラウンド処理やRFC呼び出しなど、少し特殊な場面でもデバッグが可能です。
更新タスクのデバッグ(Update Debugging)
SAPでは、データベースへの書き込みを非同期で行う「更新タスク」という仕組みがあります。CALL FUNCTION '...' IN UPDATE TASK で呼び出される処理がこれにあたります。通常のデバッグでは COMMIT WORK の後に実行される更新処理の中には入れません。
更新デバッグを有効にする方法:
- デバッガのメニュー → Settings → Change Debugger Profile/Settings → Update Debugging を有効化
- または
/hsコマンドで起動すると自動的に更新デバッグもオンになる
有効にすると、COMMIT WORK が実行された後に更新タスクの処理が始まるタイミングで再びデバッガが起動します。
バックグラウンドジョブのデバッグ
SM36 / SM37 完全解説|SAPバックグラウンドジョブの定義・監視・運用で解説しているバックグラウンドジョブも、デバッグ対象にできます。
方法1:SM37でジョブ一覧を開き、コマンドフィールドに JDBG と入力する
方法2:SM50(プロセス一覧)で実行中のジョブのプロセスを選択し、デバッガを起動する
バックグラウンドジョブはユーザー画面を持たないため、実行中のプロセスを捕まえてデバッガをアタッチするという方法になります。
RFC呼び出しのデバッグ
外部システムからRFC経由で呼び出される関数モジュールをデバッグするには、外部ブレークポイント(Ctrl+Shift+F9)を使用します。ABAPシステム側の該当関数モジュールに外部ブレークポイントを設定しておくと、RFC呼び出し時にデバッガが起動します。
デバッグの権限
デバッグ機能を使用するには、適切な権限が必要です。
| 権限オブジェクト | バージョン | 制御内容 |
|---|---|---|
| S_DEVELOP | ABAP 7.57 より前 | オブジェクト型 “DEBUG”、アクティビティ ‘02’ で変数値の変更と Goto Statement を制御 |
| S_DBG | ABAP 7.57 以降 | より細かい権限制御が可能(デバッグ開始・変数変更・Goto Statement を個別に制御) |
本番環境では、デバッグ自体は許可しつつも変数値の変更は禁止するなど、権限を細かく設定するのが一般的です。本番環境での変数変更はデータ不整合につながるリスクがあるため、セキュリティポリシーに従って厳格に管理されます。
初心者向けデバッグのコツ
最後に、デバッグを始めたばかりの方に向けた実践的なコツをまとめます。
1. まず /h から始める
デバッグの入り口は /h コマンドです。コマンドフィールドに入力してEnter → 画面の操作ボタンを押す、これだけでデバッガが起動します。難しく考えず、まずこの方法で慣れてください。
2. F5 と F6 の使い分けが効率の分かれ目
全ての行で F5(ステップイン)を押していると、フレームワークやシステム処理の奥深くまで入り込んでしまい、迷子になります。調べたい処理は F5 で中に入り、興味のない処理は F6 で飛ばす。この判断を意識するだけでデバッグ速度が大きく変わります。
3. F8 とブレークポイントの組み合わせで大きく移動
全行をステップ実行する必要はありません。調査したい箇所にブレークポイントを置いて F8 で一気にジャンプする。この使い方を覚えると、数千行のプログラムでも効率的に調査できます。
4. SY-SUBRC を常にチェックする
SY-SUBRC は、直前の処理のリターンコードが格納されるシステム変数です。0 なら成功、0 以外はエラーや該当なしを意味します。各処理の後に SY-SUBRC の値を確認する習慣をつけると、問題箇所の特定が格段に早くなります。
5. メッセージブレークポイントでエラー箇所を逆引きする
「画面にエラーメッセージが出るが、どこで発生しているかわからない」場合は、メッセージクラスとメッセージ番号でブレークポイントを設定します。メッセージの発行元に直接たどり着けるため、原因の特定が劇的に早くなります。
よくある疑問(FAQ)
Q: デバッグ中にプログラムを強制終了したい場合は?
A: デバッガのメニューから「デバッガ」→「終了」を選択するか、/h でオンにしたデバッグモードを解除するために /hd と入力します。デバッガ自体を閉じればプログラムの実行も停止します。
Q: F7(リターン)を押したら思った場所と違うところに飛んでしまった。なぜ?
A: F7 は「現在いるサブルーチン/関数モジュールから呼び出し元に戻る」操作です。たとえばサブルーチンの中から別の関数モジュールを呼んでいて、その関数モジュールの中にいる場合、F7 を押すとまずサブルーチンに戻ります(関数モジュールの呼び出し元に戻る)。Call Stack タブを確認すれば、現在どの階層にいるかがわかります。
Q: ブレークポイントを設定したのに止まらない。考えられる原因は?
A: 主な原因は3つあります。(1) セッションブレークポイントを設定したが、別のセッション(別ウィンドウ)で実行している → 外部ブレークポイントに変更する。(2) ブレークポイントを設定した行が実際には実行されない分岐にある → 条件を見直す。(3) バックグラウンドジョブで実行されている → JDBG で直接アタッチする。
Q: 変数の値を変更しようとしたが、鉛筆アイコンが表示されない。なぜ?
A: 構造体レベルでは値の変更ができません。構造体名をダブルクリックしてコンポーネント(フィールド)レベルまでドリルダウンしてから変更してください。また、権限オブジェクト S_DEVELOP / S_DBG の設定で変更権限が付与されていない場合も変更できません。
デバッグの前に「読める」状態を作りたい人へ
デバッガはあくまで「動いているコードの中身を覗くツール」なので、そもそもABAPの読み書きがある程度できる前提で初めて効いてきます。SELECT/LOOP/READ TABLE・内部テーブル・構造体・ABAPディクショナリのあたりが頭に入っていないと、ブレークポイントで止めても変数を見ているだけで終わってしまいがちです。
「文法やデータ宣言のところを一度きちんと整理したい」という場合は、アレグス株式会社・久米正通氏の『SAP ABAPプログラミング入門』を1冊やっておくと、デバッグ画面で見ている内容が一気に意味を持ちはじめます。ブレークポイントで止めた変数の型や内部テーブルの構造をすぐ読めるようになると、「なぜこの値が入っているのか」を追うときの手戻りが大きく減ります。
まとめ
- ABAPデバッガの起動は
/hコマンドが最も手軽。コマンドフィールドに入力してEnter、画面操作でデバッガが起動する - F5(ステップイン)/ F6(ステップオーバー)/ F7(リターン)/ F8(続行)の4つのキーが基本操作。F5 で深く入り、F6 で飛ばし、F7 で戻り、F8 で次のブレークポイントへジャンプする
- ブレークポイントは用途に応じて使い分ける。セッションブレークポイント(基本)、外部ブレークポイント(RFC用)、条件付き(ループ内)、メッセージ(エラー逆引き)
- 変数値の確認はダブルクリック、変更は鉛筆アイコン。デバッグ更新で条件分岐のテストが効率化できる
- ウォッチポイントは「変数がいつ変わったか」を追跡する強力なツール
- New Debugger を使うとUI の自由度が高く、Goto Statement やスクリプティングなど追加機能も利用できる
- 更新デバッグ、バックグラウンドジョブ、RFCなど特殊なシナリオにも対応可能
デバッグスキルの次のステップとして、ABAPの開発力そのものを底上げしたいなら、ABAP・OData・RAP・UI5 Fioriまで一貫して学べる実践講座が効率的です。デバッガで追うコードの意味がクリアになり、問題の切り分けが格段に速くなります。