使用GDB 调试AT&T 汇编

注:以下内容为学习笔记,多数是从书本、资料中得来,只为加深印象,及日后参考。然而本人表达能力较差,写的不好。因非翻译、非转载,只好选原创,但多数乃摘抄,实为惭愧。但若能帮助一二访客,幸甚!


调试在编程中是不可缺少的,尝试使用GDB 调试一下昨晚的AT&T汇编代码:

liury@liury-laptop:~/program/asm/cpuid$ as -gstabs -o cpuid.o cpuid.s
liury@liury-laptop:~/program/asm/cpuid$ ls
cpuid.o  cpuid.s  cpuid.s~  makefile  makefile~
liury@liury-laptop:~/program/asm/cpuid$ ld -o cpuid cpuid.o
liury@liury-laptop:~/program/asm/cpuid$ gdb cpuid 
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/liury/program/asm/cpuid/cpuid...done.
(gdb) l
1	# cpuid.s Sample program to extract the processor Vendor ID
2	.section .data
3	output:
4		.ascii "The processor Vendor ID is 'XXXXXXXXXXXX'\n"
5	
6	.section .text
7	.global _start
8	
9	_start:
10		movl	$0,	%eax		# The CPUID output option(the Vendor ID string)	
(gdb) break *_start
Breakpoint 1 at 0x8048074: file cpuid.s, line 10.
(gdb) r
Starting program: /home/liury/program/asm/cpuid/cpuid 
The processor Vendor ID is 'GenuineIntel'

Program exited normally.
(gdb) q


发现断点处没有停,后来得知此乃GDB的一个BUG...而必须在_start后面的第一个指令码元素的位置包含一条伪指令。
需要在_start后面加一条NOP指令:

_start:
	nop
	movl	$0,	%eax
	cpuid
liury@liury-laptop:~/program/asm/cpuid$ gdb cpuid
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/liury/program/asm/cpuid/cpuid...done.
(gdb) l
1	# cpuid.s Sample program to extract the processor Vendor ID
2	.section .data
3	output:
4		.ascii "The processor Vendor ID is 'XXXXXXXXXXXX'\n"
5	
6	.section .text
7	.global _start
8	
9	_start:
10		nop
(gdb) break *_start+1
Breakpoint 1 at 0x8048075: file cpuid.s, line 11.
(gdb) r
Starting program: /home/liury/program/asm/cpuid/cpuid 

Breakpoint 1, _start () at cpuid.s:11
11		movl	$0,	%eax		# The CPUID output option(the Vendor ID string)	
(gdb) next
12		cpuid
(gdb) info registers
eax            0x0	0
ecx            0x0	0
edx            0x0	0
ebx            0x0	0
esp            0xbffff0a0	0xbffff0a0
ebp            0x0	0x0
esi            0x0	0
edi            0x0	0
eip            0x804807a	0x804807a <_start+6>
eflags         0x212	[ AF IF ]
cs             0x73	115
ss             0x7b	123
ds             0x7b	123
es             0x7b	123
fs             0x0	0
gs             0x0	0
(gdb) n
13		movl	$output,%edi
(gdb) info registers
eax            0xa	10
ecx            0x6c65746e	1818588270
edx            0x49656e69	1231384169
ebx            0x756e6547	1970169159
esp            0xbffff0a0	0xbffff0a0
ebp            0x0	0x0
esi            0x0	0
edi            0x0	0
eip            0x804807c	0x804807c <_start+8>
eflags         0x212	[ AF IF ]
cs             0x73	115
ss             0x7b	123
ds             0x7b	123
es             0x7b	123
fs             0x0	0
gs             0x0	0
(gdb) print /x $ecx
$1 = 0x6c65746e
(gdb) x /42cb &output
0x80490ac <output>:	84 'T'	104 'h'	101 'e'	32 ' '	112 'p'	114 'r'	111 'o'	99 'c'
0x80490b4 <output+8>:	101 'e'	115 's'	115 's'	111 'o'	114 'r'	32 ' '	86 'V'	101 'e'
0x80490bc <output+16>:	110 'n'	100 'd'	111 'o'	114 'r'	32 ' '	73 'I'	68 'D'	32 ' '
0x80490c4 <output+24>:	105 'i'	115 's'	32 ' '	39 '\''	88 'X'	88 'X'	88 'X'	88 'X'
0x80490cc <output+32>:	88 'X'	88 'X'	88 'X'	88 'X'	88 'X'	88 'X'	88 'X'	88 'X'
0x80490d4 <output+40>:	39 '\''	10 '\n'
(gdb) c
Continuing.
The processor Vendor ID is 'GenuineIntel'

Program exited normally.
(gdb) q

注释:

break 加断点

run 运行

next 单步运行

info registers 显示所有寄存器的值

print 显示特定寄存器的值

print /d 显示十进制的值

print /t 显示二进制的值

print /x 显示十六进制的值


x 显示特定内存地址的内容

x /nyz

n是要显示的字段数,y是输出格式:

c 用于字符

d 十进制

x 十六进制
z是要显示的字段长度

b 字节8位

h 16位

w 32位字


q 退出gdb

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值