Eclipse CDTでは、gdbと連携したグラフィカルなデバッグ環境を提供しています。
早速、サンプルプログラムをホストマシンでデバッグしてみましょう。
ちなみに、今回はCDTデバッグ機能の紹介のため、同マシン上でのデバッグを行います。次回の記事で、リモートマシンで動くアプリケーションをデバッグする予定です。
CDTではデバッグの設定データをデバッグ構成として管理します。1つのデバッグ対象プログラムに対していくつものデバッグ構成を作成することが可能です。
デバッグを開始するには実行形式ファイルを選択した状態で、メニューの[実行]−[構成およびデバッグ]を選択します。画面20のような[構成およびデバッグ]画面が開くので、[C/C++ ローカル・アプリケーション]を右クリックして、[新規]ボタンをクリックします。CDTが自動で実行形式ファイルを検索して、デフォルトのデバッグ構成を作成します。
デバッグ構成では、デバッグ対象のアプリケーションに渡す起動引数や、デバッグオプションなどさまざまな設定が可能です。ここではデフォルトのまま[デバッグ]ボタンをクリックします。
[パースペクティブ切り替えの確認]ダイアログが表示されるので、[はい]をクリックします。パースペクティブが自動的にデバッグ パースペクティブへ切り替わります。main()関数の先頭で停止しているのが分かります(画面21)。デバッグ パースペクティブを用いることでグラフィカルにデバッグすることが可能です。
以下ではデバッグ パースペクティブが提供する機能を紹介します。
[デバッグ]ビューに表示されている各種のボタンを使って、ステップ実行などの実行制御を行うことができます(画面22)。
ボタンの意味はそれぞれ以下のとおりです(表3)。
プログラムの実行を停止するポイントを“ブレークポイント”と呼びます。CDTでは、エディタと連動して簡単にブレークポイントを設定できます。
ブレークポイントを設定するには、ブレークポイントを設定したい行をエディタに表示してから、その行の左端部分をダブルクリックします。するとその行にブレークポイントが設定されます。もう一度その左端部分をダブルクリックするとブレークポイントが削除されます(画面23)。
設定したブレークポイントは、[ブレークポイント]ビューに表示されます。[ブレークポイント]ビューでは、ブレークポイントを一時的に無効にしたり、ブレークポイントへ条件を付加したりといったさまざまな操作が可能です(画面24)。
あるメモリー領域へのアクセスが発生する場合に、プログラムを停止する機能を“ウオッチポイント”と呼びます。ウオッチポイントを設定するには、[ブレークポイント]ビューにて、右クリックメニューの[監視ポイントの追加]を選択します。[監視ポイントの追加]ウィンドウが表示されるので、ウオッチポイントを設定したいグローバル変数の名前を入力し、read/writeのアクセス条件を設定します。
今回はグローバル変数「globBase」の「読み取り」時にウオッチポイントを設定してみます。画面25のように設定します。
ウオッチポイントを設定したら、[デバッグ]ビューの再開ボタンをクリックします。すると、グローバル変数「globBase」の読み取りが行われた個所で停止することが分かります。
ウオッチポイントとして表4のような値が設定できます。
ウオッチポイントの設定対象 | ウィンドウへ入力する文字列 | |
---|---|---|
C言語のグローバル変数 xxx | xxx | |
C言語のグローバルな配列 yyy の1個の要素 | yyy[1] | |
C言語のグローバルな配列 yyy の10個の要素 | yyy[0]@10 | |
C言語のポインタ zzz から始まる10個の8bitsデータ | *((char*)zzz)@10 | |
アセンブラで定義されたラベル _aaa から始まる1個の8bitsデータ | *((char*)_aaa)@1 | |
アセンブラで定義されたラベル _bbb から始まる2個の16bitsデータ | *((short*)_bbb)@2 | |
アセンブラで定義されたラベル _ccc の2bytes先のアドレスから始まる4個の32bitsデータ | *((int*)(_ccc+2))@4 | |
アドレス 0x1234 から始まる8個の16bitsデータ | *((short*)0x1234)@8 | |
表4 ウオッチポイントの設定値 |
デバッグ パースペクティブには、そのほかにもアプリケーションのデバッグを手助けするさまざまなビューが提供されています。デバッグ パースペクティブが提供しているビューの一覧を表5に示します。
名前 | 説明 | デフォルト表示 |
---|---|---|
デバッグ | デバッグ対象となるプログラムの実行を管理するためのビューです。ステップ実行や停止などプログラムの実行を管理するさまざまなアイコンが表示されます。「プログラムが現在どの関数を実行しているのか」という情報もこのビューに表示されます | ○ |
変数 | ローカル変数を表示するためのビューです。Eclipseは自動的にローカル変数をこのビューに表示します。グローバル変数は自動的に表示されません。ユーザーが明示的にグローバル変数を表示する必要があります | ○ |
ブレークポイント | ブレークポイントを表示するためのビューです | ○ |
逆アセンブル | 逆アセンブル結果を表示するためのビューです。現在実行されている関数の逆アセンブル結果が表示されます | × |
コンソール | デバッグ対象のプログラムが出力するメッセージやコマンドラインツールが出力するメッセージなどを表示するためのビューです | ○ |
レジスター | レジスターの内容を表示するためのビューです。レジスターは1つのグループに分かれています。このビューはレジスターの内容を10進数、16進数、Q31フォーマットの固定小数として表示することができます | ○ |
式 | 任意の式の値を表示するためのビューです。ローカル変数やグローバル変数を組み合わせた式の値を表示させることができます | × |
メモリー | メモリーの内容を表示するためのビューです | ○ |
表5 デバッグ パースペクティブが提供しているビュー |
デフォルトでは表示されていないビューを表示するには、[ウィンドウ]−[ビューの表示]で表示したいビューを選択します。
CDTでは、gdbコマンドを直接入力することができます。CDTで提供されていないgdbの機能を利用したい場合やgdbコマンドでデバッグした方が早い場合には、コマンドラインにてデバッグを行うことが可能です。
gdbコマンドは[コンソール]ビューへ入力します。[コンソール]ビューにおいて、画面26のように画面をgdbのコンソールに切り替えます。
gdbに実行させたいコマンドをgdbのコンソールへ入力し、[Enter]キーを押します。ここでは、レジスター表示用のコマンド「info registers」と入力します。出力結果はコピー&ペーストが可能なので、解析担当者にメールなどで送付することも可能です。
デバッグが終了したら、デバッグの[停止]ボタンをクリックしてデバッグ対象のアプリケーションを終了させます。
このようにCDTを利用すると、アプリケーションのデバッグをコマンドレスでグラフィカルに行うことができ、gdbの複雑なコマンドを覚えることなく効率的にデバッグが可能となります。
これでCDTの概要説明を終了します。CDTを用いるとC/C++開発に必要なコーディング、ビルド、デバッグをグラフィカルに行うことができるため、効率的なC/C++開発が可能となります。
次回は、CDTとRSEを利用したクロスコンパイル、リモートデバッグ方法について解説します。(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.