gdb
Linux カーネルの FIQ ハンドラーでデバッガーを取得して期待どおりに動作させることができません。FIQ トリガーの条件を設定するドライバー コードには問題なくトリガーできますが、FIQ ではトリガーできません。
OlimexのARM-USB-TINY-H
デバッガー +imx233-SJTAG
コンバーター (ボードにはパラレル JTAG 用のピンがありません) を使用して、i.mx233 ボードをデバッグしています。
私はgdb 7.5.1
buildrootでコンパイルしており、openocd 0.6.1
Ubuntuリポジトリから来ています。openocd を起動します。
# openocd -f olimex-arm-usb-tiny-h.cfg -f imx233.cfg
Open On-Chip Debugger 0.6.1 (2012-12-06-17:15)
....
Info : only one transport option; autoselect 'jtag'
trst_and_srst srst_pulls_trst srst_gates_jtag trst_push_pull srst_open_drain
adapter speed: 800 kHz
dcc downloads are enabled
fast memory access is enabled
Info : max TCK change to: 30000 kHz
Info : clock speed 789 kHz
Info : JTAG tap: imx23.cpu tap/device found: 0x079264f3 (mfg: 0x279, part: 0x7926, ver: 0x0)
Info : Embedded ICE version 6
Info : imx23.cpu: hardware has 2 breakpoint/watchpoint units
ブレークポイントの開始gdb
と設定:
# arm-buildroot-linux-uclibcgnueabi-gdb vmlinux
....
target remote :3333
Remote debugging using :3333
0x00000000 in ?? ()
(gdb) monitor halt
target state: halted
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x600000d3 pc: 0xc0019024
MMU: enabled, D-Cache: enabled, I-Cache: disabled
(gdb) hbreak mydriver_userland_write
Hardware assisted breakpoint 1 at 0xc02da930: file drivers/misc/mydriver.c, line 309.
(gdb) c
Continuing.
この時点で、ユーザーランドからドライバーにメッセージを送信するたびに、gdb が喜んでトリガーされます。
Breakpoint 1, mydriver_userland_write (filp=0xc2cb81c0, buf=0x19d8600 "1\n\235\001t", count=2, f_pos=0xc2cb3f88) at drivers/misc/mydriver.c:309
309 size_t count, loff_t *f_pos) {
ユーザーランドからの情報を処理した後、FIQ がトリガーされる条件を初期化し、戻ります。ではgdb
、FIQ のブレークポイントを設定しました。(60行目は基本的に割り込みフラグクリア後の4番目のアセンブラ命令です)
## Enable catching for FIQ vectors
(gdb) monitor arm9 vector_catch fiq
reset: don't catch
undef: don't catch
swi: don't catch
pabt: don't catch
dabt: don't catch
irq: don't catch
fiq: catch
## setup the breakpoint
(gdb) hbreak myfiq_handler.S:60
Hardware assisted breakpoint 1 at 0xc02db040: file drivers/misc/myfiq_handler.S, line 60.
(gdb) c
Continuing.
すべてのセットアップが完了した後、FIQ 処理につながる条件をトリガーすると、ここで奇妙な結果が発生します。
Program received signal SIGTRAP, Trace/breakpoint trap.
0xffff001c in ?? ()
私はこの時点で本当に何もできません:
## Try to see call trace
(gdb) bt
#0 0xffff001c in ?? ()
## Try stepping
(gdb) step
Cannot find bounds of current function
(gdb) next
Cannot find bounds of current function
monitor reg
次のような登録状態を示していますhttp://paste.ubuntu.com/6113942/
vmlinux マップ ファイルを見ると、PC はファイルの最後の 4 行を文字通り指しています。
ffe5095d A __crc_groups_free
fff3672c A __crc_directly_mappable_cdev_bdi
ffffe9f5 A __crc_cfg80211_wext_giwfrag
w __crc_softirq_work_list
コマンドを使用するstepi
と、実行全体がハングしているように見えます。
私はまだ使用方法を学んgdb
でいるので、今どこで問題を探すべきか本当にわかりません..どんな提案も大歓迎です!