LPCXpressoのデバッグ画面

前回の デバッグ・プローブ編 に続き、LPCXpresso でのデバッグ方法を解説します。この手の IDE に慣れていないと、沢山あるウィンドウやその中のタブに戸惑うことと思います。また LPCXpresso IDE - User Guide 中のデバッグに関する説明も内容が薄く、あまり役に立ちません。

そこで本記事では「これだけ知っていれば、大抵のソースコードデバッグはOK」な項目に絞って解説をします。逆に「オンチップのトレースバッファを活用したアセンブリ言語レベルのデバッグ」や「SWO(Serial Wire Output)によるトレース」には触れていません。これらについては「LPCXpresso IDE Instruction - Trace Guide」や「LPCXpresso IDE SWO - Trace Guide」を参照してください(僕も使いこなせていませんので…)

全体構成

まずは IDE の全体像を掴み、どこに何が表示されるかを把握してこそ効率的なデバッグができると僕は思うので、少し長くなりますが、1つ1つ解説したいと思います。

全体構成 ビューのレイアウト変更

デバッグを開始すると、コンパイルだけしていた時より1つ増えて5つの “ビュー” が開きます。この時、右上の Open Perspective(Open Perspective)ボタンを押すといくつかの選択肢が出てくるので「Debug」を選びます。すると外観がデバッグに適した “ビュー” の配置に変更されます。

このように “Open Perspective” ボタンでその時々の作業内容に合わせて外観を変更できるので、好みで使い分けると良いでしょう(以下の解説は「Develop」を元にしています)。

① アプリケーション全体のリソース情報を表示するビュー

どのビューにも特定の名前がついているワケではありません。その内容からタイトルのような名前をつけているだけですので、悪しからず。

Project Explore タブ

Project Explore

プロジェクト、あるいはワークスペース全体のファイル構成をツリー形式で参照することができます。お馴染みだとは思いますが、ソースコードを選択し、エディタに表示することができるタブです。

Peripherals タブ

Peripherals

ADC やタイマーなど、オンチップの周辺機能が一覧で表示されます。左側のチェックボックスを選択すると、③ Memory タブ にレジスタの内容を表示することができます。

Registers タブ

Registers

CPU のレジスタやスタックポインタ、プログラムカウンタなどを参照できます。⑤ デバッグタブ 右上の Instruction Stepping Mode(Instruction Stepping Mode)ボタンによるアセンブリ言語のステップ実行モード選択時に役立ちます。

Symbol Viewer タブ

Symbol Viewer

Browse for a file with symbol table(Browse for a file with symbol table)ボタンで実行ファイル *.axf を指定すると、テキストやデータ、bss など各セクションのメモリ配置情報を参照することができます。

② エディタ ビュー

お馴染みの各種ファイルを編集したり表示したりする役割を持ったビューです。

ブレーク(停止)中の行

現在ブレーク(停止)中の行

現在停止中で、これから実行される行が若草色にハイライトされます。

カーソル位置の情報表示

カーソル位置の情報表示

関数や変数、シンボルなどにカーソルを合わせると、その定義内容や変数の値を参照することができます。

右クリックでコンテキストメニューを表示

右クリックでコンテキストメニューを表示

特定の行で右クリックをするとコンテキストメニューが開きます。多くのメニューがありますが、デバッグに役立つのは次の4つでしょう。

  • Run to line Run to line
    カーソルのある行まで実行します。

  • Move to line Move to line
    現在停止中の行からカーソルのある行にジャンプします。プログラムカウンタが直接書き換えられ、その間のコードは実行されません。問題のある箇所をすっ飛ばして処理を継続させたいと時に使います。

  • Resume at line Resume at line
    カーソルのある行から実行を再開します。④ Variables タブ で変数の値を書き換えた後に、再評価したい場合に用います。

  • Add Watch Expression… Add Watch Expression…
    選択された変数や式を ④ Expressions タブ に追加します。

ブレークポイントの設定

ブレークポイントの設定

行番号をダブルクリックするか、カーソルのある行で右クリックしてコンテキストメニューを開き「Add Breakpoint…」を選択してブレークポイントを設定します。ブレークポイントの一覧は、④ Breakpoints タブ で確認することが出来ます。

③ 実行中のリソース情報を表示するビュー

高度なトレースを行う “Instruction Trace” タブと “SWO Trace Config” タブ、LPC1343 で対象外の “Power Measurement Tool” タブ以外を解説します。

Console タブ

Console

コンパイルの実行結果が表示される以外に、printf() の出力がここに表示されます。「ビュートローバーでprintfデバッグ、ついでに赤外線センサの特性を測る」との競合については後述します。

Problems タブ

Problems

実行中に起きた問題に関するリソース情報がここに表示されるのだと思います。実際に何か表示されたことがないのであくまでも想像ですが…

Memory タブ

Memory

直接メモリのアドレスを指定(→ メモリマップ)するか、① Peripherals タブ でチェックを入れたレジスタの情報がここに表示されます。メモリ中の値を直接編集することも可能です。

Properties タブ

Properties

実行オブジェクトのサイズなど、実行中のリソースに関する情報がここに示されます。

Navigator

① Project Explore タブ と同じなので、邪魔なら閉じちゃって良いと思います。

④ ショートカット、およびデバッグ情報を表示するビュー

一貫した名前が付けられそうもないビューですが、デバッグ中は頻繁に見ることになると思います。

Quickstart Panel タブ

Quickstart Panel

色々なタスクのショートカットが集められたタブです。デバッグも一発で開始できて便利です。

Variables タブ

Variables

実行中の関数内ローカル変数は、ここで参照できます。またセルをクリックして変数の値を直接変更することもできます。

Breakpoints タブ

Breakpoints

② エディタビュー で設定されたブレークポイントの一覧が表示されます。各ブレークポイントを一時的に無効にしたり有効にしたりするのもこのタブで行います。

Outlines タブ

Outlines

実行中のソースコードに定義されたシンボルや関数、グローバル変数の一覧が参照できます。各項目をクリックするとその箇所をエディタで示してくれるので、何気に便利なタブです。

Expressions タブ

Expressions

変数や式を ② エディタビュー で選択したり、直接セルに入力することで、それらの値を参照することが出来ます。当然、実行中のスコープ外にある変数や式などは無視されます。

⑤ デバッグ ビュー

デバッグは “セッション” という形で管理され、実行中のセッションに関する情報がここに表示されます。

Debug タブ

Debug

実行中の スタックフレーム が表示されます。特に便利な機能として View menu(View menu)ボタンを押すとデバッグ制御用のボタンが表示されるので、このタブで集中的に実行をコントロールできるようになります。

また Instruction Stepping Mode(Instruction Stepping Mode)ボタンで ② エディタビュー に逆アセンブルされたコードを表示することができ、アセンブリ言語レベルでのステップ実行が可能になります。

ビューのレイアウト変更について

レイアウトをリセットする

“Open Perspective” ボタンを使う以外にも、マニュアルで各ビューの配置を変更したり、独立させたりすることが出来ますが、弄り過ぎて元に戻したくなることがあります。そんな時はメニューから「Window → Perspective → Reset Perspective…」を選びましょう。元の配置に戻してくれます。

デバッグ制御用アイコン

デバッグ制御用アイコン

全体像が把握できたところで、いよいよデバッグ制御用のボタンを駆使してデバッグするワケですが、各ボタンの機能は全然難しくありません。

以下に、”高度なトレース機能” を使う以外のボタンを示します。

アイコン 名称 説明
全ブレークポイントをスキップ Skip All Breakpoints 全ブレークポイントをスキップする/しないを制御するトグルボタン
続行(Resume) Resume 停止中の実行を再開するボタン
一時停止(Suspend) Suspend 実行中のプログラムを停止(ブレーク)させるボタン
終了(Terminate) Terminate デバッグを終了させるボタン
ステップ・イン(Step In) Step In 最小の実行単位で、1行ごとの実行、または関数呼び出しであればその中に入って実行する
ステップ・オーバー(Step Over) Step Over 関数呼び出しであってもその中には入らず1行ごとに実行する
ステップ・リターン(Step Return) Step Return Step In で関数内に入った場合、その関数の終了まで実行し呼び出し元に戻る
再スタート(Restart) Restart もう一度初めからスタートする
再デバッグ(Debug) Debug デバッグ途中でソースコードを変更した時など、再度コンパイルからやり直してデバッグを開始する

最後に、コンソールに printf() 出力する方法

デバッグ・プローブ編USB CDC(Communication Device Class)をインストール し、Tera Term などのターミナル・ソフトウェアに printf() 出力する方法を解説しましたが、③ コンソール に出力するためには LPCXpresso 側の設定が必要です。

以下にその方法を示し、本記事を〆たいと思います。

USB CDC をインストールした場合

sci.c の25行目あたりの定義 SYSTEM_CALL を無効化し、代わりに __sys_write() など Redlib のシステムコール関数群がリンクされるようにします。

/*--------------------------------------------------------------------------
 * CMSISのstdio系関数がリンクされる場合は、重複するシステムコールの定義を無効にする
 *--------------------------------------------------------------------------*/
#define	SYSTEM_CALL	0	// 有効化=1、無効化=0

Redlib (semihost) の設定

Redlib(semihost)の設定

LPCXpresso のメニューから「Project → Properties」を開き、「C/C++ Build → Settings → MCU Linker → Managed Linker Script」をたどり、「Library」に Redlib (semihost) を選択します。そして再コンパイルすれば printf() の出力先がコンソールになります。

以上!