インテル® JTAG デバッガーとイベントトレースの併用によるシステム・ソフトウェア・デバッグ

インテル® System Studio組込み

この記事は、インテル® デベロッパー・ゾーンに掲載されている「System Software Debug with JTAG and Event Trace」(http://software.intel.com/en-us/articles/intel-system-studio-jtag-sven-sdk) の日本語参考訳です。


インテリジェント・システムで採用されている SoC (システムオンチップ) ベースの設計は、複数の異なるコアが搭載され、ソフトウェア・スタックが複数のコアを利用するプラットフォームではますます複雑になります。これは、デバイスのライフサイクルを通じて一貫した信頼性を保証するという課題に加えて、さらなる複雑性をソフトウェア・スタックにもたらします。そのため、ハードウェアとプラットフォームに関する深い洞察と、システム全体のソフトウェア・スタック情報を提供できる、システム/アプリケーションのデバッグ・ソリューションが重要になります。インテル® System Studio は、EFI ベースのファームウェア、ブートローダー、OS カーネルからデバイスドライバー、アプリケーションまで広範にわたり、ソースレベルの言語でのデバッグ、ターゲットデバイスのレジスターセットおよびハードウェア・ステータスに関する洞察など、必要な機能と情報を提供します。異なるソフトウェア・コンポーネント間の相互作用は、多くの場合タイミング・センシティブです。コンポーネント間で多くの相互作用があるコードベースをデバッグする際、1 つの特定のコンポーネントをシングルステップで処理して問題を特定することは、現実的ではありません。デバッグそのものが動作タイミングに影響を及ぼし、さらに悪い問題 (ハイゼンバグ) を引き起こす可能性があるため、従来の printf デバッグもこうした用途では有効ではありません。この記事では、インテル® JTAG デバッガーと低オーバーヘッドのインストルメンテーション・ベースによるイベントトレースを併用することにより、最も厄介なランタイムの問題を、決定論性の有無に関係なく特定して解決する方法を説明します。

主な機能:

  • 完全な Eclipse* RCP (Rich Client Platform) Linux* および Windows* ホスト環境
  • デバイスレジスターとメモリー割り当てがビジュアル化された JTAG (Joint Test Action Group) IEEE 標準 1149.1 ベースのデバッグ
  • OS、ファームウェア、ドライバーを認識したデバッグ
  • デバッガーに統合された 2 進数および 16 進数イメージから NOR および NAND メモリーへの書き込み (図 1)
  • 高度な命令トレースとイベント追跡
  • 製品コードを含む、コード中の非決定論的な問題を特定する低レイテンシーのインストルメンテーション

図 1: デバッガーに統合されたインテル® Atom™ プロセッサー CE5300 上の
NAND および NOR メモリーへの書き込み

インテル® System Studio の各コンポーネントは、さまざまな Linux* ホストをサポートしています。インテル® JTAG デバッガーによるシステム・ソフトウェア・デバッグでは、Microsoft* Windows* ホストもサポートされています。ただし、インテル® System Studio に含まれるインテル® JTAG デバッガーは、現在インテル® Atom™ プロセッサーのみ対応しています。  この記事では、ホストシステムは標準の Linux* ディストリビューション・ベースで、ターゲットシステムはインテル® Atom™ プロセッサー・ベースの Wind River* Linux* または Yocto Project* と想定します。このような組込みソフトウェア・スタックの各レイヤーにおけるデバッグでは、それぞれ異なるアプローチが必要です。ファームウェアからアプリケーション・レイヤーまで、各ソフトウェア・レイヤーごとに典型的な課題とデバッグ・アプローチについて見てみましょう。

ファームウェア、ブートローダー、および OS

図 2: インテル® JTAG デバッガー

初期のハードウェア構成とボードの起動に対して、インテル® System Studio は Eclipse* RCP ベースのユーザー・インターフェイスによる JTAG デバッグをサポートしています。このインターフェイスには、次のような機能があります。

  • デバイス・コントロール、プロセッサー・ステータス、ソフトウェア・ステータスを管理するレジスターのビットフィールド・エディター。各ビットの機能が分かります。
  • ビジュアル化されたページテーブル。仮想アドレスから物理メモリーへのマッピングが分かります。
  • グローバル記述子テーブル (GDT) とローカル記述子テーブル (LDT) へのアクセス。GDT はメモリーセグメントが実行/書き込み可能かどうかを示し、LDT は特定のプログラム用にメモリーセグメントを予約します。
  • OS のメモリー管理と構成の認識。問題が起こるデータ割り当てを特定できます。

図 3: インテル® JTAG デバッガーのメモリーレイアウト認識

インテル® JTAG デバッガーは低レベルのデバッグだけでなく、高レベルの問題解決にも役立ちます。例えば、ページテーブルと GDT および LDT をビジュアル化することで、スタック・オーバーフローなどのメモリーアクセス問題の原因を簡単に特定できます。ハードウェアとソフトウェアを認識したインテル® JTAG デバッガーによる深い洞察は、多くの問題を解決へと導く鍵となるでしょう。

図 4 は、メモリー構成のビットフィールド・エディターと詳細情報を割り込み記述子テーブルに適用しています。これらは、特定の OS シグナルの原因を見つけるのに役立ちます。

図 4: インテル® JTAG デバッガーのビットフィールド・エディターと割り込み記述子テーブル

インテル® System Studio は、Macraigor Systems* usb2Demon* デバイスおよびインテル® ITP-XDP3 JTAG など、プローブを使用した JTAG デバッグをサポートします。usb2Demon* デバイスは、インテル® Atom™ プロセッサー・ベース・システム向けの低価格で包括的なデバッグ・ソリューションです。ボードテスト、起動、初期化からアプリケーションのデバッグ、製造ラインテストまで広範にわたってカバーします。

UEFI (Unified Extensible Firmware Interface)

開発者は、UEFI のデバッグでしばしば困難に直面するでしょう。UEFI は、OS とファームウェア間のインターフェイスです。つまり、BIOS (Basic Input/Output System) の現代版と言えます。

UEFI 環境は再配置可能なコードモジュールを使用し、通常モジュールアドレスはエンドユーザーには分かりません。インテル® System Studio のシンボルデバッグ機能により、コードモジュールの場所を特定し、リセット直後に UEFI デバッグを可能にすることでこの問題を解決します。メモリー中のコードモジュールの場所を特定する一般的な方法は 2 つあります。

  • UEFI ランタイムが把握しているすべてのモジュールのリストを表示し、開発者が特定のモジュールのシンボルをロードできるようにします。
  • 特定のメモリーアドレス (例えば、命令ポインターなど) にあるモジュールを見つけます。

デバイスドライバー

デバッグにおける別の大きな課題としてデバイスドライバーが挙げられます。デバイスドライバーは、多くの場合タイミング・センシティブなため、ドライバーコードにインストルメンテーションを追加すると動作が変わってしまいます。この課題への対策として、インテル® System Studio は OS およびドライバーを認識するカーネルモジュールをターゲットデバイスにロードすることで、インストルメンテーションに依存しないデバッグ機能を提供します。デバイスドライバーのロード時に、このカーネルモジュールは JTAG インターフェイスを介して、ドライバーの初期化と破棄を行うメソッドのメモリー位置をホストに知らせます (図 5)。そのため、コードを変更したり、インストルメンテーションを追加しなくても、デバイスドライバーのシンボル情報をロードし、ステップインして実行フローをデバッグできます。これは、ドライバーコードのタイミング動作を変える心配がありません。

図 5 動的にロードされるカーネルモジュールと OS 認識

さらに、ビットフィールド・エディターはパブリック・デバイス・レジスターにアクセスできるため、デバイスドライバーのデバッグ中にデバイス構成レジスターの項目を監視できます。

命令トレース

エラーの原因を特定することがデバッグの目的です。インテル® System Studio は、高度な命令トレースにより、命令フローを展開してランタイム問題の原因を見つけます。具体的には、LBR (Last Branch Records) を調査し、コードを逆アセンブルして、プログラムフローを再現します。そして、アセンブリー命令とソースコード (組込み Linux* の場合は ELF Dwarf 実行形式) を関連付けて、デバッガー・インターフェイスにトレース結果を表示します。

図 6: LBR 命令トレース

トレースはリアルタイム・パフォーマンスに影響しないため、スタック・オーバーフローやセグメンテーション・フォルトなどの決定論的で再現性のあるエラーを追跡する強力な手法です。次の手順で行います。

  1. OS シグナル・イベント・ハンドラー (例えば、セグメンテーション・フォルト) にブレークポイントを設定します。
  2. イベントまでの実行フローを展開します。
  3. 実行フローを遡り、想定される動作と異なる動作が発生した場所を特定します。
  4. その場所まで再実行し、メモリーアクセスを解析します。

非決定論的で再現性の低い問題

最近のインテリジェント・システムは、特にスレッドを多用する場合や、ソフトウェア・モジュール間のメッセージまたはデータパッシング・イベントに依存する場合など、ますますタイミング・センシティブになりつつあります。これらのシステムでは、非決定論的で再現性の低い問題がよく発生します。

このようなシステムのデバッグは困難です。コードのデバッグがソフトウェア・スタックのタイミングに影響してアプリケーション動作が変わることで、デバッグセッション中に問題を再現できません (これはハイゼンバグと呼ばれます)。特に、デバイスが市場に導入された後に問題が発生した場合は、デバイスにアクセスできない可能性もあり、さらに深刻な状況になります。

この問題のソリューションとして、SVEN (Software Visible Event Nexus) Technology ソフトウェア開発キット (SDK) プレビュー版を利用できます。SVEN は、スタティック・コードのインストルメンテーションとタイミング・オーバーヘッドが 5µs 以下の小さな DRAM バッファーを利用するため、ハイゼンバグが発生する可能性を最小限に抑えます。SVEN により、従来の方法では見つけられない、タイミングに依存するランタイムの問題を特定することができます。製品版コードにインストルメンテーション・コードを残しても、ロギングを有効にしなければ実行に影響しないため、SVEN はアクセスが困難な場所に配置されたアプリケーションのオフラインデバッグに最適です。

図 7 SVEN SDK アーキテクチャー

当初、インテル® Atom™ プロセッサー CExxxx ベースのプラットフォーム向けに開発された SVEN は、現場で実証されたテクノロジーであり、現在はすべてのインテル® アーキテクチャーで利用できます。SVEN は現代の複雑なシステム向けに設計されているため、チップセット全体にわたって非同期メッセージとデータイベントを追跡します。高度に設定可能で、システム・ソフトウェアとアプリケーションの両方のインストルメンテーションに使用できます。必要なのは、イベントのタイミングを関連付けるための信頼できるクロックシグナルだけです (図 8)。

図 8 SVEN Trace Viewer

インテル® System Studio は、イベントとタイミングの参照を容易にし、不規則性を迅速に見つけるグラフィカル・トレース・ビューアと、オープンソースの SDK として SVEN フレームワークを提供します。さらに、JTAG サポートにより、データ・ブレークポイントを用いてシステムレベルのデバッグが可能です。そのため、任意の SVEN イベントでトリガーし、疑わしいイベントのステップ処理やデバッグを行えます。

図 9 SVEN イベントの JTAG デバッグトリガー

まとめ

インテル® System Studio とそのコンポーネントであるインテル® JTAG デバッガーおよび SVEN SDK は、複数の SoC IP ブロックにわたる複雑なソフトウェア・スタック上で、厄介な問題や追跡が困難なランタイム問題を特定し解決するツールを提供します。 

これらの強力なデバッグツールの使用法と機能に関する詳細は、添付のドキュメント (英語) を参照してください。

添付ファイルサイズ
jtag-release-install.pdf (https://software.intel.com/sites/default/files/managed/f5/38/jtag-release-install.pdf)630.7KB
w-jtag-release-install.pdf (https://software.intel.com/sites/default/files/managed/eb/22/w-jtag-release-install.pdf)641.81KB
sven-sdk.pdf (https://software.intel.com/sites/default/files/managed/a3/8b/sven-sdk.pdf)572.29KB
sven-viewer.pdf (https://software.intel.com/sites/default/files/managed/d6/f2/sven-viewer.pdf)1MB
xdb-usage.pdf (https://software.intel.com/sites/default/files/managed/e7/33/xdb-usage.pdf)855.57KB
xdb-quickstart-lin.pdf (https://software.intel.com/sites/default/files/managed/cb/9f/xdb-quickstart-lin.pdf)886.28KB

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました