« T2SPのT-Kernelソースコードのビルド(eclipseの設定) | トップページ

2016/02/11

T2SPのT-Kernelソースコードのデバッグ(準備編)

 以前の記事に記載したとおり、T2SPにはQEMUが含まれています。
 QEMUは、GDB Serverを持っているので、GDBによるデバッグが可能です。
 GDBは、以前の記事に記載したARM用のものを使用します。
 以下、eclipse+CDTでGDBによるデバッグの設定などの覚書です。

 まず、eclipseの設定について。
 eclipseでGDBによるデバッグを実行するために、"Debug Configurations"に設定を追加します。
 メニュー[Run]->[Debug Confirurations...]で表示される"Debug Configurations"の[C/C++ Remote Application]で右クリックして[New]により、新しい設定を追加します。
 設定する内容は以下のとおりです。

----
・[Name:]に適当な名称を入力(ここでは"T-Kernel"とします)
・下部に表示されているのが"Using GDB(DSF) Automatic Remote Debugger Launcher"の場合、"Select other"をクリックして、「Select preferred Launcher」で[Use configuration specific settings]をチェックして、"Using GDB(DSF) Manual Remote Debugger Launcher"を選択
・[Main]タブで以下を設定
→[C/C++ Application:]に"${workspace_loc:/tkernel_source}/kernel/sysmain/build/tef_em1d/kernel-rom.rom"を入力(ELFファイルの指定)
→[Disable auto build]をチェック
・[Debugger]タブで以下を設定
→[Stop on startup at:]に"usermain"を入力(デフォルトのブレークポイント。チェックを外すとブレークしません)
→[Main]タブの[GDB debugger:]に"C:¥gnutools¥bin¥arm-*-eabi-gdb.exe"を入力(ARM用GDBの指定。環境に合わせて"*"は変更してください)
→[Connection]タブの[Type:]が"TCP"であることを確認
→[Connection]タブの[Host name or IP address:]が"localhost"であることを確認
→[Connection]タブの[Port Number:]に"1234"を入力
----

 上記は、カーネル部のELFファイルによりデバッグする場合の設定ですが、T-Monitor部のELFファイルでデバッグする場合には、

----
・[Name:]に適当な名称を入力(ここでは"T-Monitor"とします)
・[Main]タブの[C/C++ Application:]に"${workspace_loc:/tkernel_source}/monitor/tmmain/build/tef_em1d/tmonitor"を入力
・[Debugger]タブの[Stop on startup at:]に"reset_entry"を入力
----

としてください。
 なお、eclipseからGDBを実行するために、"C:\MinGW\bin"にある以下のdllファイルが必要となります。

----
libiconv-2.dll
libexpat-1.dll
libgcc_s_dw2-1.dll
----

 これらは、"C:\gnutools\bin"にコピーしてください(eclipseからGDBを実行する際に、"C:\MinGW\bin"にPATHを通す方法が分からなかったので)。

 続いて、QEMUの準備について。
 QEMUは、zipを展開したT2SPの"T-Kernel2.0/emulator"に格納されています。この下のフォルダ"tef_em1d"に"readme.txt"が格納されているので、これに記載されているとおり、binフォルダを"C:\qemu\bin"にコピーします。
 QEMUの実行について、"readme.txt"にはコマンドプロンプトから"qemu.bat"にオプションをつけて起動する方法が記載されていますが、多少面倒なので、エクスプローラーから"qemu.bat"をダブルクリックして実行できるように"qemu.bat"を編集します(GDBでデバッグするためのオプションも追加します)。
 具体的には、

----
C:\qemu\bin\qemu-tef_em1d.exe -s -S ^
-cpu arm1176jzf-s ^
-kernel rom.bin ^
-sd sd.img ^
-serial tcp:127.0.0.1:10000,server ^
-rtc base=localtime ^
-dipsw dbgsw=on ^
-nographic
-----

とします。
 オプション"-s"がGDB Serverの設定ですが、これは"-gdb"の短縮形です。"-s"でGDBが接続しない場合には、"-gdb tcp::1234,ipv4"みたいにすることで、接続するかもしれません。

 QEMUで実行するバイナリファイル"rom.bin"は、ソースファイルの"/kernel/sysmain/build/tef_em1d"のmakefileを使用して、"make emu"により作成します(当然、全てのビルドが正常に完了していて、必要なELFファイルが全て揃っている必要があります)。
 具体的には、MSYSで以下を実行します(binファイルの"qemu/bin"へのコピーを含む)。

----
export BD=/c/work/T-Kernel2.0/srcpkg/tkernel_source/
export GNU_BD=/c/gnutools
export _GNU_CONFIG=arm-*-eabi
export GNUARM_2=${GNU_BD}/${_GNU_CONFIG}
export PATH=/c/MinGW/msys/1.0/bin:${PATH}
cd ${BD}/kernel/sysmain/build/tef_em1d
make emu
cp -f rom.bin /c/qemu/bin
----

 PATHの指定には、"/c/MinGW/bin"も必要かもしれません。
 なお、T2SPに含まれている資料には、明確な記載が見当たらなかったのですが、デフォルトではビルド時のgccのオプションに"-g"が指定されていません。
 これを回避するためにビルド時の環境変数の設定として、"export mode=debug"を実行します。
 ただし、この環境変数を設定することで、余計なデバッグ用のマクロ定義が有効となるので、一部makefileの編集が必要で、"/etc/sysdepend/tef_em1d/makerules.sysdepend"の81行目の"CPPFLAGS += "の最後にある"-DDEBUG"を削除してください。

 そして、QEMUを実行して、GDBを接続する手順について。
 大まかな流れは、「QEMU起動→telnet接続→GDB起動(接続)」です。
 まず、"C:\qemu\bin"の"qemu.bat"を実行しQEMUを起動します。コマンドプロンプトが表示され、telnet接続待ちとなります。
 telnetは何でもよいのですが、ここではMSYSを使用して説明します。MSYSのtelnetは、MinGWのインストーラーで、パッケージ"msys-inetutils"がインストールされていれば使用できます。
 telnet接続のため、MSYSで"telnet localhost 10000"を実行します。
 正常にtelnet接続すると、

----
Connected to localhost.
Escape character is '^]'.
----

と出力されます(が、まだリンカスクリプトの修正が必要で、デフォルトのままだと、この時点でQEMUが落ちます。これについては、次回記載予定)。
 telnet接続後に、GDBの起動(接続)です。
 eclipseのPerspectiveを"Debug"に切り替え、"Debug Configurations"から上記で設定した"T-Kernel"を実行([Debug]ボタンをクリック)してください。
 正常に起動(接続)すると、eclipseのConsoleにそれっぽい出力があり、T-Monitorが正常に起動すると、telnetに、

----
T-Monitor/tef_em1d Version 2.01.00

TM>
----

と出力されます。
 ここで、telnet(T-Monitor)で、

go 0x70030000

を入力すると、カーネル部が起動され、正常に動作すればusermain()でブレークします(が、ソースコードの修正が必要で、デフォルトのままだとtelnetのエラー情報が出力され、カーネル部は正常起動しません。これについても、次回記載予定)。

 QEMU(デバッグ)を終了する場合には、telnet(T-Monitor)で"exit"を入力してください(eclipse側からの停止の実行はうまく行きませんので、QEMUを終了してください)。

|

« T2SPのT-Kernelソースコードのビルド(eclipseの設定) | トップページ

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/55806/63194417

この記事へのトラックバック一覧です: T2SPのT-Kernelソースコードのデバッグ(準備編):

« T2SPのT-Kernelソースコードのビルド(eclipseの設定) | トップページ