適用範囲:DS-5
可能です。DS-5デバッガはadd-symbol-fileコマンドを用いて再配置された(つまり、メモリマップ上で他のアドレスに移動またはコピーして実行される)コードのソースレベルデバッグをサポートしています。
デバッグ情報が含まれるデバッグバージョンのELFイメージ(-gオプションつきでコンパイルされたもの)があるとして、DS-5デバッガにデバッグシンボルをロードし、アドレスオフセットをそれらに適用することができます。
例えば、ベースアドレスが0x8000としてビルドされた実行可能ファイルprog.axf内のコードが、実行時に一部の関数が0x18000番地に再配置(ARM Linkerのスキャッタローディング機能のようなビルドツールの機能なしで)されるとすると、0x10000のアドレスオフセットをコードが移動された後でデバッグできるように適用することができます。
loadfile prog.axf #デバッグ情報付きイメージをロードします
この初期コードをソースレベルデバッグ (例えば、single-stepを行って)することができます。
一部の関数を移動またはコピーするコードを実行しているとします。それらの関数のうちの一つを実行した直後にコードを停止します。さらに:
file # 既存のデバッグ情報を破棄します add-symbol-file prog.axf 0x10000 # オフセットを追加してデバッグ情報をロードします
これで該当する関数をソースレベルでデバッグ(ステップ実行など)することができます。
元々の移動しない呼び出し側のコードに戻りたいときには、次のように行います:
file # 既存のデバッグ情報を破棄します add-symbol-file prog.axf # 元のベースアドレスでデバッグ情報をロードします
この機能は一般的に、Linuxカーネルなどにおいて、U-BootのようなRAM内の別の場所にコードを再配置する(一例としてDS-5 U-Bootのサンプルを参照)U-Bootのようなブートローダのデバッグや、MMUを有効にする前のOSコードのデバッグなどでも使われます。
MMUを有効にする前のLinuxカーネルのソースレベルデバッグでは、コードの仮想と物理アドレス間でのオフセットを計算する必要があります。
例えば、カーネルが仮想アドレス0xC0008000としてリンクされ、物理アドレス0x80008000にロードされる(DS-5 Example Linux Distributionのケース)場合、オフセットは、0x80008000 - 0xC0008000 = -0x40000000となります。
カーネルデバッグシンボルを次のようにオフセットつきでロードできます:
add-symbol-file vmlinux -0x40000000
MMUを有効にする前と、MMUを有効にした後のステージの両方に関する、Linuxカーネルのデバッグに使用できるDS-5デバッガの完全なサンプルについては、以下のARM社Software Enablement Blogを参照してください:
Software Enablement Blog: Porting Linux Made Easy With DS-5