ホストおよびカーネル デバッグの開始 - 2020.1 Japanese

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2020-08-20
Version
2020.1 Japanese
ソフトウェア エミュレーションでは、ハードウェア アクセラレータをよりよくモデリングできるように、FPGA バイナリの実行は別のプロセスとして実行されます。ホスト コードのデバッグに GDB を使用している場合は、カーネル コードはホスト コード プロセス内で実行されるわけではないので、カーネル コードで設定されているブレークポイントは発生しません。ホスト コードおよびカーネル コードの同時デバッグをサポートするため、Vitis デバッガーには、デバッグ サーバー (xrt_server) を使用して実行されるカーネルに接続するシステムがメカニズムがあります。ホスト コードおよびカーネル コードをデバッグ サーバーに接続するには、次の手順を使用して 3 つのターミナル ウィンドウを開く必要があります。
ヒント: このフローは、GNU から入手可能な DDD (Data Display Debugger) などの GDB 用のグラフィカル フロントエンドを使用した場合でも使用できます。GDB を起動するには、次の手順に従います。
  1. 3 つのターミナル ウィンドウを開き、各ウィンドウを Vitis 環境の設定 で説明されているように設定します。3 つのウィンドウは、次のように使用します。
    • xrt_server を実行
    • ホスト コードで GDB (xgdb) を実行
    • カーネル コードで GDB (xgdb) を実行
  2. 最初のターミナルの環境を設定したら、次のコマンドを実行して Vitis デバッグ サーバーを起動します。
    xrt_server --sdx-url

    デバッグ サーバーは、ホストおよびカーネルからのデバッグ コマンドをリッスンし、2 つのプロセスを接続して 1 つのデバッグ環境を作成します。xrt_server から標準出力に listener port <num> と返されます。カーネル プロセスのデバッグに GDB でこのリスナー ポートが使用されるので、リスナー ポートの番号を継続的にチェックします。このプロセスを制御するには、新しい GDB インスタンスを開始し、xrt_server に接続する必要があります。これは、次の手順で実行します。

    重要: xrt_server の実行中は、実行されるすべての GDB プロセスはユーザーからの指示を待機します。GDB が xrt_server に接続されない場合、またはコマンドを供給しない場合は、カーネル コードがハングしているように見えます。
  3. 2 番目のターミナルの環境を設定したら、次の手順に従って、ホスト コード用に GDB を起動します。
    1. ENABLE_KERNEL_DEBUG 環境変数を設定します。たとえば、C シェルに次のように入力します。
      setenv ENABLE_KERNEL_DEBUG true
    2. アプリケーションの実行 の手順に従って、XCL_EMULATION_MODE 環境変数を sw_emu モードに設定します。たとえば、C シェルに次のように入力します。
      setenv XCL_EMULATION_MODE sw_emu
    3. xrt.ini ファイル に説明されているように、ランタイム デバッグ機能を xrt.ini ファイルのエントリを使用してイネーブルにする必要があります。ホスト実行ファイルと同じディレクトリに xrt.ini ファイルを作成し、次の行を含めます。
      [Debug]
      app_debug=true
      

      これにより、カーネルがデバッグ用にコンパイルされていることと、XRT ライブラリでデバッグ機能をイネーブルにする必要があることが、ランタイム ライブラリに通知されます。

    4. ザイリンクス ラッパーから gdb を起動します。
      xgdb --args <host> <xclbin>
      <host> はホスト実行ファイルの名前、<xclbin> は FPGA バイナリの名前です。次に例を示します。
      xgdb --args host.exe vadd.xclbin

      xgdb ラッパーから GDB を起動すると、Vitis デバッガー用に次の手順が実行されます。

      • GDB に指定のホスト プログラムを読み込みます。
      • GDB コマンド プロンプトで source コマンドを使用して Python スクリプトを読み込み、Vitis デバッガー拡張機能をイネーブルにします。
        gdb> source ${XILINX_XRT}/share/appdebug/appdebug.py
  4. 3 番目のターミナルの環境を設定したら、xgdb コマンドを実行し、gdb プロンプトで次のコマンドを実行します。
    • ソフトウェア エミュレーションの場合:
      file <Vitis_path>/data/emulation/unified/cpu_em/generic_pcie/model/genericpciemodel

      <Vitis_path>Vitis コア開発キットのインストール パスです。$XILINX_VITIS 環境変数の使用は、GDB 内では機能しません。

    • ハードウェア エミュレーションの場合:
      1. xrt_server の一時ディレクトリ /tmp/sdx/$uid を検索します。
      2. このデバッグ セッションの DWARF ファイルを含む xrt_server プロセス ID (PID) を検索します。
      3. gdb コマンド ラインで file /tmp/sdx/$uid/$pid/NUM.DWARF を実行します。
    • どちらのエミュレーションでも、カーネル プロセスに接続します。
      target remote :<num>

      <num> は、xrt_server から返されるリスナー ポート番号です。

    ヒント: Vitis IDE でソフトウェア/ハードウェア エミュレーションのカーネルをデバッグする場合は、ホスト コードおよびカーネル コードを同時にデバッグするための環境が用意されていれば、これらの手順が自動的に処理され、カーネル プロセスも自動的にデバッグされます。

3 つのターミナル ウィンドウで xrt_server、ホスト用の GDB、カーネル用の GDB を実行すると、必要に応じてホストまたはカーネルにブレークポイントを設定し、continue コマンドを実行してアプリケーションをデバッグできます。すべてのカーネル実行が終了すると、ホスト コードは続行し、xrt_server 接続が解除されます。

重要: ソフトウェアおよびハードウェア エミュレーション フローでは、アクセラレーションされたカーネル コードのデバッグの操作に制限があります。このコードは、ソフトウェア エミュレーション フローでは前処理され、ハードウェア エミュレーション フローでは RTL に変換されるので、すべての位置にブレークポイントを設定できるとは限りません。特にハードウェア エミュレーションでは、保持されるループおよび関数など、限られた数のブレークポイントしかサポートされません。このような制限はありますが、この設定はホスト コードとカーネルの通信をデバッグするのに有益です。