9.1 スナップショットビューアについて

インタラクティブデバッグが使用できないシナリオにおける単一プロセッサのアプリケーション状態のスナップショットを解析するには、スナップショットビューアを使用します。

スナップショットビューアを使用したアプリケーションのデバッグを有効にするには、以下のデータが必要です。
  • レジスタ値
  • メモリ値
  • デバッグシンボル。
このすべてのデータを用意できないと、使用可能なデバッグのレベルが低下します。このデータのキャプチャはアプリケーション固有であり、このためのツールは用意されていません。例外ハンドラまたは信号ハンドラをインストールして、アプリケーションのエラー状況を見つけ、必要なデータをダンプする必要がある場合があります。
また、ダンプしたデータをデバイスからデバッガがアクセス可能なワークステーション上に取得する方法についても考慮する必要があります。この方法についてのいくつかの提案を以下に示します。
  • セミホスティングを使用してデータをホストワークステーション上のファイルに書き込みます。
  • UART を介して端末にデータを送信します。
  • TCP/IP を使用してソケットを介してデータを送信します。

レジスタ値

レジスタ値は、ある時間の特定ポイントでのシステムの状態をエミュレートするために使用されます。最も重要なレジスタは現在のプロセッサモードのレジスタです。例えば、ARMv4 アーキテクチャプロセッサでは、これらのレジスタは R0-R15 と以下のプログラムステータスレジスタ(PSR)です。
  • カレントプログラムステータスレジスタ(CPSR)
  • アプリケーションプログラムステータスレジスタ(APSR)
  • セーブドプログラムステータスレジスタ(SPSR)
多くの ARM® プロセッサでは、データアボートなどの例外が発生すると、別のプロセッサモードに切り替わることに注意してください。この場合、使用するレジスタ値は、例外ハンドラ内のレジスタ値ではなく、例外を起こした正しいモードを反映することを確認する必要があります。
また、アプリケーションで浮動小数点データが使用されており、デバイスにベクタ浮動小数点ハードウェアがある場合は、スナップショットビューアにベクタ浮動小数点レジスタの内容を指定する必要があります。キャプチャする重要なレジスタを以下に示します。
  • 浮動小数点ステータスおよび制御レジスタ(FPSCR)
  • 浮動小数点例外レジスタ(FPEXC)
  • 単精度レジスタ(Sn
  • 倍精度レジスタ(Dn
  • 4 倍精度レジスタ(Qn

メモリ値

大半のアプリケーション状態は通常、グローバル変数、ヒープ、およびスタックの形式でメモリに格納されます。サイズの制約のために、スナップショットビューアにメモリ内容全体をコピーするのが難しいことがあります。このような場合、特に重要なメモリ領域を慎重に検討する必要があります。
クラッシュをデバッグする場合に、クラッシュの要因を見つけ出すのに有用な情報はコールスタックであることが多いです。コールスタックは、対応するすべての関数パラメータの値や例外以前の各関数の呼び出しシーケンスを示すためです。コールスタックを表示するには、デバッガが現在のスタックポインタを認識しており、スタックを含むメモリの内容にアクセスできる必要があります。デフォルトでは、ARM プロセッサではスタックが下方に展開されるので、現在のスタックポインタから開始し、スタックの開始位置に達するまでメモリ内を上方に向かって展開するメモリを用意する必要があります。スタックの内容全体を指定できない場合でも、最近の関数呼び出しが分かるため、現在のスタックポインタから始まる一部分でも有効です。
アプリケーションでグローバル( extern またはファイル static )データを使用している場合は、対応するメモリ値を指定するとデバッガ内の変数を表示できます。
ヒープデータを指すローカルまたはグローバル変数がある場合は、デバッガの関連ポインタに従ってデータを検証することが必要になる場合があります。これを行うには、スナップショットビューアにヒープの内容を指定しておく必要があります。ヒープはメモリの広い範囲を占有してしまうことがあり、ヒープ全体をキャプチャできないことがあるので注意してください。メモリ内のヒープのレイアウトとヒープ割り当てを制御するデータ構造は、アプリケーションまたは C ライブラリ固有である場合があるので、詳細については、関連のマニュアルを参照してください。
逆アセンブリレベルでデバッグするには、アプリケーションコードが配置されているメモリ値にデバッガからアクセスできる必要があります。通常はコードを含むメモリの内容をキャプチャする必要はありません。これは、多くの場合、fromelf などの処理ツールを使用して同じデータをイメージから直接抽出できるからです。ただし、以下のような複雑な状況に注意して下さい。
  • イメージおよびメモリ内の値が変わる可能性がある自己変更型コード。
  • 実行時のイメージ内でのメモリアドレスのダイナミックな再配置。

デバッグシンボル

デバッガには、以下のようなアプリケーションに関する高レベルの情報を表示するために、デバッグ情報が必要です。
  • ソースコード
  • 変数の値と型
  • 構造体
  • コールスタック。
この情報はコンパイラおよびリンカによってアプリケーションイメージ内に格納されるので、デバイス上で実行されている同じイメージのローカルデバッグコピーがあることを確認する必要があります。イメージに格納されるデバッグ情報の量と、デバッグセッションの結果として生じる品質には、コンパイラおよびリンカに渡されるデバッグと最適化の設定が影響する場合があります。
組み込みデバイスでイメージを実行するときは通常、できる限り多くのデバッグ情報を取り除きます。このような場合、デバッグ時はデバッグ情報を取り除く前のイメージを使用して下さい。
関連する作業
9.3 スナップショットビューアへの接続
関連する参考文書
9.2 スナップショットビューア初期化ファイルのコンポーネント
9.4 スナップショットビューアのデバッガスクリプト作成時の注意事項
非機密扱いPDF file icon PDF 版ARM DUI0446VJ
Copyright © 2010-2015 ARM.All rights reserved.