[Contents]   [Back]   [Prev]   [Up]   [Next]   [Forward]  


GNU Emacsの中でのGDBの使用

GDBでデバッグ中のプログラムのソース・ファイルをGNU Emacsを使って参照(および編集)するための、 特別なインターフェイスが提供されています。 このインターフェイスを使うには、 Emacsの中でM-x gdbコマンドを使います。 デバッグしたい実行ファイルを引数として指定してください。 このコマンドは、 GDBをEmacsのサブプロセスとして起動し、 新しく作成したEmacsバッファを通じて入出力を行います。 Emacsの中でのGDBの使い方は、 通常のGDBの使い方とほぼ同様ですが、 2つ相違点があります。

これは、 GDBコマンドとその出力、 および、 デバッグ対象のユーザ・プログラムによる入出力の両方に適用されます。 以前に実行したコマンド・テキストをコピーして再入力することができるので便利です。 出力された部分に関しても同様のことができます。 EmacsのShellモードで利用可能なすべての機能を、 ユーザ・プログラムとのやりとりで使うことができます。 特に、 通常どおりにシグナルを送信することができます。 例えば、 C-c C-cで割り込みシグナルを、 C-c C-zでストップ・シグナルを発生させることができます。

GDBがスタック・フレームを表示するときにはいつでも、 Emacsがそのフレームのソース・ファイルを自動的に見つけて、 カレント行の左側の余白に矢印 (`=>') を表示します。 Emacsはソース・コードを別バッファに表示し、 スクリーンを2つに分けて、 GDBセッションとソースをともに表示します。 GDBのlistコマンドやsearchコマンドを明示的に使えば、 通常どおりの出力を生成することもできますが、 これらをEmacsから使う理由はおそらくないでしょう。

注意: ユーザ・プログラムの存在するディレクトリがユーザのカレント・ディレクトリでない場合、 ソース・ファイルの存在場所についてEmacsは簡単に混乱に陥ります。 このような場合、 ソースを表示するための追加のディスプレイ・バッファは表示されません。 GDBは、 ユーザの環境変数PATHのリストの中にあるディレクトリを探索してプログラムを見つけ出しますので、 GDBの入出力セッションは通常どおり進行します。 しかしEmacsは、 このような状況においてソース・ファイルを見つけ出すのに十分な情報をGDBから受け取っていません。 この問題を回避するには、 ユーザ・プログラムの存在するディレクトリからGDBモードを開始するか、 M-x gdbの引数の入力を求められたときに、 絶対パスでファイル名を指定します。 Emacsの既存のGDBバッファから、 デバッグ対象をどこかほかの場所にあるプログラムに変更する目的でGDBのfileコマンドを使うと、 同様の混乱の発生することがあります。

デフォルトでは、 M-x gdb`gdb'という名前のプログラムを呼び出します。 別の名前でGDBを呼び出す必要がある場合 (例えば、 異なる構成のGDBを別の名前で持っているような場合) は、 Emacsのgdb-command-nameという変数を設定します。 例えば

(setq gdb-command-name "mygdb")

(をESC ESCに続けて入力するか、 あるいは、 *scratch*バッファまたは`.emacs'ファイルに入力することで) Emacsはgdbの代わりに「mygdb」という名前のプログラムを呼び出します。 GDBのI/Oバッファでは、 標準的なShellモードのコマンドに加えて、 以下のような特別なEmacsコマンドを使うことができます。

C-h m
EmacsのGDBモードの機能に関する説明を表示します。
M-s
GDBのstepコマンドのように、 ソース行を1行実行します。 さらに、 カレントなファイルとその中における位置を示すために、 表示ウィンドウを更新します。
M-n
GDBのnextコマンドのように、 関数呼び出しをすべてスキップして、 現在の関数内の次のソース行まで実行を進めます。 さらに、 カレントなファイルとその中における位置を示すために、 表示ウィンドウを更新します。
M-i
GDBのstepiコマンドのように、 1命令を実行します。 必要に応じて表示ウィンドウを更新します。
M-x gdb-nexti
GDBのnextiコマンドを使って、 次の命令まで実行します。 必要に応じて表示ウィンドウを更新します。
C-c C-f
GDBのfinishコマンドのように、 選択されたスタック・フレームを終了するまで実行を継続します。
M-c
GDBのcontinueコマンドのように、 ユーザ・プログラムの実行を継続します。 注意: Emacs v19では、 このコマンドはC-c C-pです。
M-u
GDBのupコマンドのように、 数値引数によって示される数だけ上位のフレームに移動します (The GNU Emacs Manualの`Numeric Arguments'を参照 (4))。 注意: Emacs v19では、 このコマンドはC-c C-uです。
M-d
GDBのdownコマンドのように、 数値引数によって示される数だけ下位のフレームに移動します。 注意: Emacs v19では、 このコマンドはC-c C-dです。
C-x &
カーソルの位置にある数値を読み取り、 GDBのI/Oバッファの末尾に挿入します。 例えば、 以前に表示されたアドレスの前後のコードを逆アセンブルしたいとしましょう。 この場合、 まずdisassembleと入力し、 次に表示されたアドレスのところにカーソルを移動し、 disassembleへの引数をC-x &で読み取ります。 gdb-print-commandリストの要素を定義することによって、 これをさらにカスタマイズすることができます。 これが定義されていると、 C-x &で入手した数値が挿入される前に、 それをフォーマットしたり、 処理したりすることができるようになります。 C-x &に数値引数を指定すると、 特別なフォーマット処理を必要としているという意味になり、 その数値がリストの要素を取得するためのインデックスとなります。 リストの要素が文字列の場合は、 挿入される数値はEmacsのformat関数によってフォーマットされます。 リストの要素が文字列以外の場合は、 その数値が、 対応するリスト要素への引数として渡されます。

どのソース・ファイルが表示されている場合でも、 EmacsのC-x SPCgdb-break)コマンドは、 ポイントの置かれているソース行にブレイクポイントを設定するようGDBに対して指示します。 ソースを表示中のバッファを誤って削除してしまった場合に、 それを再表示させる簡単な方法は、 GDBバッファの中でfコマンドを入力して、 フレーム表示を要求することです。 Emacs配下では、 カレント・フレームのコンテキストを表示するために必要であれば、 ソース・バッファが再作成されます。 Emacsによって表示されるソース・ファイルは、 通常どおりの方法でソース・ファイルにアクセスする、 普通のEmacsバッファによって表示されます。 そうしたいのであれば、 これらのバッファの中でファイルの編集を行うこともできますが、 GDBとEmacsの間で行番号に関する情報が交換されていることを頭に入れておいてください。 テキストに行を挿入したり、 削除したりすると、 GDBの認識しているソース行番号は、 実際のコードと正しく対応しなくなってしまいます。


[Contents]   [Back]   [Prev]   [Up]   [Next]   [Forward]