やまものブログ

メモ書きブログです (^_^;A

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 を動かすホスト側だけがシンボル情報を使うのですね