Xilinx Zynq QEMU - gdb によるデバッグ
QEMU 上で動かしているアプリを gdb でデバッグする方法をメモ書きします。
まず、QEMU 起動コマンドにポート 1234 へのリダイレクトを追加します。これが無いと接続できませんでした。
-redir tcp:1234:10.0.2.15:1234
QEMU(ターゲット、サーバ、リモート) にて gdbserver をアプリ(ここでは a.out) を指定して起動します。
root@zynq:~# gdbserver 10.0.2.15:1234 ./a.out
続いて、ホスト側です。gdb を a.out を指定して起動します。
$ arm-xilinx-linux-gnueabi-gdb ./a.out
gdb が起動したら、(gdb) プロンプトから target コマンドでポート 1234 を指定します。
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
_start () at qadd.s:4
4 mov r1, #0xff000000
この a.out は SIGSEGV で終了するものです。c で実行すると問題箇所を特定できます。
(gdb) c
Continuing.
Program received signal SIGSEGV, Segmentation fault.
h2a () at writeHEX32.s:20
20 str r1, [r3], #4 @ write buf
(gdb)
手順が前後しますが、ソースをコンパイルする際には、-g オプションをつけてデバッグ情報を埋め込みます。
# 余談ですが、as には最適化オプション -O<数字> が無いことを初めて知りました
オブジェクトをリンク(a.outを作成)する際には -s (ストリップ) オプションは付けません。
なお、ターゲットで実行する a.out については、ストリップしてもいいらしいです(未確認)。gdb を動かすホスト側だけがシンボル情報を使うのですね
まず、QEMU 起動コマンドにポート 1234 へのリダイレクトを追加します。これが無いと接続できませんでした。
-redir tcp:1234:10.0.2.15:1234
QEMU(ターゲット、サーバ、リモート) にて gdbserver をアプリ(ここでは a.out) を指定して起動します。
root@zynq:~# gdbserver 10.0.2.15:1234 ./a.out
続いて、ホスト側です。gdb を a.out を指定して起動します。
$ arm-xilinx-linux-gnueabi-gdb ./a.out
gdb が起動したら、(gdb) プロンプトから target コマンドでポート 1234 を指定します。
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
_start () at qadd.s:4
4 mov r1, #0xff000000
この a.out は SIGSEGV で終了するものです。c で実行すると問題箇所を特定できます。
(gdb) c
Continuing.
Program received signal SIGSEGV, Segmentation fault.
h2a () at writeHEX32.s:20
20 str r1, [r3], #4 @ write buf
(gdb)
手順が前後しますが、ソースをコンパイルする際には、-g オプションをつけてデバッグ情報を埋め込みます。
# 余談ですが、as には最適化オプション -O<数字> が無いことを初めて知りました
オブジェクトをリンク(a.outを作成)する際には -s (ストリップ) オプションは付けません。
なお、ターゲットで実行する a.out については、ストリップしてもいいらしいです(未確認)。gdb を動かすホスト側だけがシンボル情報を使うのですね