我想gdb对于在Linux系统下开发的程序员来说是再熟悉不过的了,因为在Linux下比较少的IDE环境来调试代码,所以调试linux下的代码就那么几种方法的,其中gdb调试是最有效,尤其是一些逻辑上的bug。gdb还有个强大功能就是调试as汇编代码,今天来简单的看下gdb的使用。
.section .data outputi: .ascii "hello word!\n" .section .text .global _start _start: movl $4, %eax movl $1, %ebx movl $outputi, %ecx movl $13, %edx int $0x80 movl $1, %eax movl $0, %ebx int $0x80上面代码是打印hello word的例子,其中去除掉了一些无关的代码。
为了使用gdb调试,所以在编译时要加入gdb的一些调试信息:as -gstabs -o test.o test1.s(c语言中gcc -g -o test test.c),链接为:ld -o test test.o;
开始命令:gdb test;
设置断点:break *_start + 1(cpu运行到 _start+1 的地址上会停止,break可以简写b)
开始运行:run (会运行到第一个断点位置上,一般和断点一起使用)
单步调试:step (会一行一行执行代码,遇到函数会进入函数中执行,step可以简写s)
单步调试:next (和上面的命令类似但,但遇到函数不会进入,直接跳过函数,next可以简写n)
顺序执行:cont (当把问题解决后,想直接运行完,可以使用该命令)
查看所有寄存器:info registers (查看所有寄存器的状态)
查看单个寄存器:print (查看单个寄存器,其中可以定义输出格式,x=十六进制、d=十进制、o=八进制、t=二进制,print/x $eax,因为eax中是一个立即数了,所以用$)
查看指定内存数据:x (x/nyz,n表示需要打印的字符数,y表示输出格式和print格式一样,z表示按多少长度来显示,x/16cb &outputi:16字节,字符格式输出,字节宽度显示,&outputi:outputi是标签表示地址,所以用&起地址上内容显示)
实例操作如下图:
gdb对汇编调试方法基础的就这些,还有稍微复杂些的,等到后面要使用的时候自己再查资料。
转载请注明作者和原文出处,原文地址:http://blog.csdn.net/yuzhihui_no1/article/details/42584283