很简单, 虚拟机我用的是Vmwareworkstation和ubuntu系统了。。。关于这个有很多不同的软件的,都可以的!
(一)首先介绍一些关于gdb中的一些调试命令
(1)如何进入gdb调试
其实这个很简单,下面就具体说一下步骤(通过C语言源程序的方式)
如果是通过汇编语言的话,那么需要先编译链接一下汇编程序,命令如下:
首先(编译):as -g second.asm -o second.o ----->编译汇编程序(-g 表示的方便后面进行gdb的调试)
其次(链接):ld second.o -o second -------------->链接程序
最后:运行测试:./second ------------>运行
剩下的就和C语言一样了,因为已经生成了可执行文件(比如上面的second)
1)首先是编写一个C语言程序(这里命名为test1.c),比如
2)生成可执行文件,命令-------------gcc test1.c -o first
3)运行可执行文件,这样能够测试程序是否正确(如果运行结果与期望值一样,或者没有运行错误即表示正确)。命令------------./first
方法一:
4)进入gdb模式,直接命令--------gdb
5)出现如下图所示的结果,也就是等待用户输入gdb命令。
6)然后加载需要进行gdb调试的可执行文件即可(这里的文件名和之前的对应就可以)。命令-------file first
7)OK,到这就已经成功进入了gdb模式。
方法二:(前面3步都是一样的)
4)直接命令---------gdb first,然后进入的就和上面的一样了。
上面的两种方法都可以,其实实质是一样的,只是一个是后面加载文件(第一种方法),而另一种是提前加入文件(第二种)
(2)关于gdb模式的一些基本命令
这里还加入两条特别又重要的命令吧!
objdump -d second ------------------->显示程序的内存和代码对应的机器指令(非gdb命令)
gdb second ---------------->将程序second进入gdb的调试(非gdb命令)
下面的就都是gdb的命令了哦!!!
缩写:
breakpoint------------------b
delete-------------------------------d
infomation------------------------info
run---------------------------------r
next---------------------------------n
step--------------------------------s
print--------------------------------p
quit--------------------------------q
--------------------------------------------------------------------------------------------------------------------------------------------------------------
b *_start+1 ------------->加断点,在某个地方,+1表示第一行程序的位置
b 行数------------------>打断点,比如b 8
b 函数名------------->打断点,比如 b main
b 代码地址---------->打断点,比如 b *0x804835c
d ------------------->删除所有断点
d 断点编号---------->删除第几个断点
info br -------------->查看所有断点信息
r-------------------->运行程序(如果没有断点,则直接运行完整个程序,否则在断点处停止)
c------------------>Continue的简写,继续执行被调试程序,直至下一个断点或程序结束。
n------------------->单步运行一句代码(如果有函数,则直接运行完整个函数)
s------------------>单步运行一句代码(如果有函数,则会进入函数)
info reg----------->查看寄存器的内容(简写为 i r)
info r 寄存器名---------->查看具体的某一个寄存器的内容(比如 info r eax)
x/4bt 0x804855(内存地址起始)-------------->表示的是显示内存的内容地址
p 变量名--------------->打印显示对应变量的内容
p $eax ------------------->打印显示查看寄存器eax中的值
p &eax ------------------->打印显示查看寄存器eax中的内存地址
display /i $pc----------->每次程序中断后可以看到即将被执行的下一条汇编指令,其中 $pc 代表当前汇编指令,/i 表示以十六进行显示。当需要关心汇编代码时,此命令相当有用。
undispaly---------------->取消先前的display设置,编号从1开始递增。
q---------------------->退出gdb调试
help [命令名称]------------>GDB帮助命令,提供对GDB名种命令的解释说明。如果指定了“命令名称”参数,则显示该命令的详细说明;如果没有指定参数,则分类显示所有GDB命令,供用户进一步浏览和查询。
(三)编辑C语言程序常用指令(预处理--编译---汇编---链接)
预编译:gcc -E hello.c -o hello.i;
编译:gcc -S hello.i -o hello.s
汇编:gcc -C hello.s -o hello.o
执行:gcc hello.o -o hello(生成文件名)
如果用到非库函数,需要用:gcc hello.c -lm -o hello
简单快速的编译运行方法:
gcc hello.c -o hello(其中hello表示为你要运行后的名字)
./hello --->表示运行
(四)汇编程序的运行
首先(编译):as -g second.asm -o second.o ----->编译汇编程序(-g 表示的方便后面进行gdb的调试)
其次(链接):ld second.o -o second -------------->链接程序
最后:运行测试:./second ------------>运行