デバッグにブレークポイントを使用する方法


9

ブレークポイントは、コンパイラーがコードに対してどのように実行されるかを確認するための優れた方法です。私の質問は、コードをデバッグするときにブレークポイントを使用する可能性はあるのでしょうか?

回答:


9

Majenkoの回答で述べたように、Arduino IDEはブレークポイントメカニズムを提供していませんが、Atmel Studioはブレークポイントをサポートしています。[*]

ただし、スイッチとLEDがある場合は、ブレークポイントのいくつかの利点を提供する方法でプログラムの進行状況を追跡できます。たとえばBPReport()、シリアル出力またはLCDを介して重要な変数の値を報告し、LEDを点灯させ、スイッチが押されて解放されるまで、デバウンスで待機するサブルーチンを追加します。BPReport()無条件のブレークポイントが必要な場所ならどこでもルーチンを呼び出します。条件付きブレークポイントの場合、trueの場合BPReportIf(cond)に呼び出すルーチンを作成 できます。シリアル経由で出力したくない場合は、複数のLEDまたはLCDを使用できます。外部ブレークコントロールが必要な場合は、複数のスイッチを使用できます(たとえば、追加のスイッチの1つをテストできます)。BPReport()condcond

[*]一部のハードウェアデバッガーは、ブレークポイントが追加、変更、または削除されるたびに、ダウンロードされたコードを変更します。その使用法は、たまにダウンロードするよりも速くフラッシュメモリを消耗します。チップがそのようなデバッグに頻繁に使用されている場合は、そのチップを本番システムで使用しないでください。


4

マジェンコの答えは正しいですが、他にもいくつかの選択肢があります。

majenkoが述べた実際のハードウェアデバッグに関しては、次のように言います。

  1. Atmel Studioやsloeber(私は作成者)と呼ばれるarduino Eclipseプラグインなどの実際のIDEをインストールして使用します。
  2. フルハードウェアデバッガー、またはArduio zeroなどのオンボードのハードウェア、またはUSBデバッグを可能にするESP8266などの他のデバッグテクノロジーを使用するハードウェアを使用します。

まったく異なるカテゴリの別のデバッグオプションは、コードを編成して、決定ロジック(ハードウェアに依存しない)とアクション(ハードウェアに依存する)を完全に分離することです。

次に、スケッチをローカルプログラムとしてコンパイルし、ローカルマシンで「決定ロジック」をデバッグします。この方法では、「ハードウェアデバッグ」はできません。この方法では、単体テストも可能です。

ローカルマシンはおそらく32ビットまたは64ビッターであり、ほとんどのArduinoは8ビッターであるため、この方法を使用する場合は特に注意が必要なデータ型の違いが生じることに注意してください。


4

Arduinoの-デバッグライブラリはArduinoのスケッチのためのシンプルなオンターゲットデバッガを提供します。デバッグコマンドがスケッチに直接追加されます。デバッガーコマンドシェルは、ブレークポイントとアサーションで開始されます。

ここに画像の説明を入力してください

上のスクリーンショットは、アプリケーションで使用されるシリアル出力モニターとデバッガーシェルで使用されるSerial1を備えたArduino Megaで実行されたスケッチ例を示しています。

スケッチデバッグコマンド

  • ASSERT(cond)アサート条件をチェックします。falseの場合、デバッグシェルが呼び出されます。スケッチを続行できません。
  • BREAKPOINT()デバッグシェルが呼び出されます。
  • BREAK_IF(cond)条件が真の場合、デバッグシェルが呼び出されます。
  • CHECK_STACK(room)スタックに空き(バイト)があることを確認します。falseの場合、デバッグシェルが呼び出されます。
  • DEBUG_STREAM(dev)指定されたストリームデバイスをデバッグセッションに使用します。通常はシリアル。
  • OBSERVE(expr)式をデバッグストリームに出力します。
  • OBSERVE_IF(cond、expr)条件が真の場合、式をデバッグストリームに出力します。
  • REGISTER(var)デバッグシェルからアクセスするための変数を登録します。シェルコマンドのデバッグ

シェルコマンドのデバッグ

  • ?VARIABLE 変数のアドレスと値を出力します。
  • @VARIABLE ポインター変数のアドレスと参照値を出力します。
  • backtrace 単純な呼び出しスタックを出力します。
  • コマンドコマンドの リストを出力します(ヘルプも参照)。
  • data データ領域の内容、つまりグローバル変数を出力します。
  • 行く 休暇デバッグシェルをスケッチの実行を継続します。
  • heapヒープの 内容、つまり動的に割り当てられたデータを出力します。
  • help コマンドのリストを出力します。
  • memoryメモリの状態を出力します。
  • 停止スケッチを終了します。
  • stackスタックの 内容、つまり呼び出しフレーム、引数、戻りアドレスを出力します。
  • variables 登録されている変数のリストを出力します。
  • where デバッグシェルが呼び出されたソースコードファイルと行を出力します。

すべてのデバッグシェルコマンドは、1文字のコマンドに短縮できます。詳細については、READMEを参照してください。インストールの詳細、サンプルスケッチ、ベンチマーク。


1
Mikaelの寄付ライブラリを使用すると、条件付きブレークポイントの設定、変数の値の出力、メモリステータス、呼び出しトレース、およびブレークポイントでの変数の検査と変更ができます。プロ:ハードウェア($$)を必要とせず、フラッシュ上でハードビートしません(ハードウェアデバッガーによるブレークポイントの設定と削除のように)。....
JRobert

1
....短所:タイムクリティカルなコードを調べる場合、プログラムのコードスペース、一部のRAMスペース、および場合によってはランタイムへの影響が大きい。ライブラリ呼び出しをコンパイルする(そして後で削除する)ための学習曲線。ブレークポイントの場所を予測するか、必要な場所を見つけたときに再コンパイルする必要があります。短所はミカエルの作品に対する批判ではありません。彼らはこのテクニックを備えています。
JRobert

1
@JRobert Nice Pro-Conのまとめ!デバッガーを調整できるようにすることで、いくつかの短所に対処しようとしました。フットプリントの影響を受けやすいアプリケーションがデバッグシェルを最小限にできるようにする一連の定義があります。組み込みシステム用のデバッガーと同様に、ブレークポイントを使用してタイムクリティカルな(連続的な)コードをデバッグすることは困難です。唯一の選択肢は観測点です。これらは、トレースバッファーを使用して最適化し、タイムクリティカルなコードでシリアル出力を削除することができます。
Mikael Patel

3

Arduino IDEにはありません。

必要がある:

  1. Atmel Studioなどの実際のIDEをインストールして使用し、
  2. フルハードウェアデバッガーを使用する

ブートローダーを使用したUART / USBインターフェイスを介したデバッグは提供されていません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.