アセンブラプログラムをデバッグする
こういったソースがあるとします。
.data
msg: .ascii "hello world\n"
msgend: .equ len, msgend - msg.global main
main:
movl $4, %eax
movl $1, %ebx
movl $msg, %ecx
movl $len, %edx
int $0x80
ret
gcc helloworld.s -o hw
そうするとhwという実行ファイルが出来るのでデバッグしてみます。
gdb hw
(gdb) break main
Breakpoint 1 at 0x804a01c
(gdb) run
Starting program: /home/hirosandesu/hwBreakpoint 1, 0x0804a01c in msgend ()
(gdb) disassemble
Dump of assembler code for function msgend:
0x0804a01c <msgend+0>: mov $0x4,%eax
0x0804a021 <msgend+5>: mov $0x1,%ebx
0x0804a026 <msgend+10>: mov $0x804a010,%ecx
0x0804a02b <msgend+15>: mov $0xc,%edx
0x0804a030 <msgend+20>: int $0x80
0x0804a032 <msgend+22>: ret
0x0804a033 <msgend+23>: add %al,(%eax)
End of assembler dump.(gdb) i r
eax 0xbffff494 -1073744748
ecx 0xd0951f80 -795533440
edx 0x1 1
ebx 0x27eff4 2617332
esp 0xbffff3ec 0xbffff3ec
ebp 0xbffff468 0xbffff468
esi 0x0 0
edi 0x0 0
eip 0x804a01c 0x804a01c <msgend>
eflags 0x200246 [ PF ZF IF ID ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51(gdb) p/x $eax
$1 = 0xbffff494
(gdb) stepi
0x0804a021 in msgend ()
(gdb) p/x $eax
$2 = 0x4
(gdb) stepi
0x0804a021 in msgend ()
(gdb) x/s 0xbffff3ec
0xbffff3ec: "VK\025"
(gdb) stepi
0x0804a030 in msgend ()
(gdb)
hello world
(gdb) c
Continuing.Program exited with code 014.
(gdb) q
こんな感じです。
簡単に説明すると
gdb 実行ファイルで起動
break mainでmainにブレークポイントをセット
runで実行
disassembleでアセンブラを表示
i r(info register)でレジスタ情報の表示
p/x $eaxでeaxレジスタを16進数で表示
x/s アドレスでアドレス位置の文字列を表示
c(continue)で続行
qで終了
といった感じです。
楽しいですね。