Linux下汇编语言编程初步使用gdb调试程序

Linux大全评论867 views阅读模式

Linux下汇编语言编程初步使用gdb调试程序
调试是编写程序中一个永恒的话题,除非你的程序永远没有错误。本文介绍Linux下如何使用gdb调试汇编程序:
gdb(GNU Debugger)是一款功能非常强大的调试器,它的GUI版本叫做Kdbg,运行于KDE桌面环境。很多Linux发行版默认含有gdb
例子程序:
程序中-start:标签后加上nop语句是为了在gdb中能够暂停程序

#cpuid.s Sample program
.section .data
output:
.ascii "The processor Vendor ID is 'xxxxxxxxxxxx'\n"
.section .text
.globl _start
_start:
nop //gdb中暂停程序用
movl $0, %eax
cpuid
movl $output, %edi
movl %ebx, 28(%edi)
movl %edx, 32(%edi)
movl %ecx, 36(%edi)
movl $4, %eax
movl $1, %ebx
movl $output, %ecx
movl $42, %edx
int $0x80
movl $1, %eax
movl $0, %ebx
int $0x80
为了使用gdb调试汇编程序,必须对源程序加上-gstabs选项进行编译,编译之后的程序中含有可供gdb识别的调试附加信息:

$as -gstabs -o cpuid.o cpuid.s
$ld -o cpuid cpuid.o
$
然后启动gdb进行调试:

$gdb cpuid
GNU gdb //此处为版权信息若干行
(gdb)
用run命令运行程序

(gdb)run
Starting program: /home/path/cpuid
The processor Vendor ID is 'GenuineIntel'
Program exited normally
(gdb)
程序正常运行,并显示了结果The processor Vendor ID is 'GenuineIntel'。gdb中单步调试程序必须先设置断点(breakpoint)。我们这里把断点设置在开头,使用命令break * label+offset来设置断点:

(gdb)break * _start+1
Breakpoint 1 at 0x12345678: file cpuid.s 12
(gdb)run
Starting program: /home/path/cpuid
Breakpoint 1,_start() at cpuid.s 12
12 movl $0, $eax
(gdb)
断点设置的时侯,必须指定其对最近标签的相对位置,所以这里设定断点为_start标签之后的一个偏移,也就是nop语句,如果没有nop语句,或者设定断点为_start标签位置,那么程序不会停止,而会继续执行下去(gdb的bug?)。现在程序停在了第一条语句,屏幕显示的是将要执行的语句,接下来可以使用next或者step命令单步执行程序,cont继续执行余下全部程序。

企鹅博客
  • 本文由 发表于 2019年12月15日 14:51:53
  • 转载请务必保留本文链接:https://www.qieseo.com/129596.html

发表评论