アセンブリ言語の教科書 第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章からスタートですが気にしないで(笑