アセンブリ言語の教科書 第3章 GDBの使い方。
アセンブリでprintfデバッグは辛すぎなのでのGDBデバッグについて学ぶ。
アセンブリでも-gオプションが使える。
% gcc -g -o hello hello.s % gdb hello (gdb) l 1 .text 2 .global main 3 4 main: mov $1, %eax 5 mov $0xFFFF, %ax 6 mov $0b101010, %ah 7 mov $0, %eax 8 ret
アセンブリの場合、ステップの扱いが違う。また、表示も便利なオプションを発見した。C言語と違う部分だけメモ。
- $eaxでレジスタの参照が出来る。
- %ではないので混乱しそう。
- si(stepi)
- ステップ実行 sすると飛んでく。注意。
- ni(nexti)
- ステップアウト call先へは飛ばない。
- p/x $eax(print)
- %eaxを16進数で表示
- display/t $eax
- %eaxを2進数で監視
- i registers(info)
- レジスタのダンプ(超便利)
- i all-registers
- 全てのレジスタのダンプ
- x $sp
- アドレスの値を表示。
デバッグしてみる。
(gdb) b main Breakpoint 1 at 0x8048324: file hello.s, line 4. (gdb) r Starting program: /home/tanaka/study/gas/hello/hello Breakpoint 1, main () at hello.s:4 4 main: mov $1, %eax Current language: auto; currently asm (gdb) si 5 mov $0xFFFF, %ax (gdb) i registers eax 0x1 1 ecx 0x44b4a88e 1152690318 edx 0x1 1 ebx 0xa67ff4 10911732 esp 0xbf96f6ac 0xbf96f6ac ebp 0xbf96f708 0xbf96f708 esi 0x4ff88ca0 1341688992 edi 0x0 0 eip 0x8048329 0x8048329 <main+5> eflags 0x200246 [ PF ZF IF ID ] cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x33 51
eaxが1になっていることが確認できた。
si,i registersを覚えておけば生きていけそう。
いきなり3章からスタートですが気にしないで(笑