gdb入门笔记

来源:互联网 发布:软件编程学费 编辑:程序博客网 时间:2024/05/18 03:35

要想搞开发不学点调试还是不行的。拖了好久,今天要行动了~

1.为了可以在gdb中调试,在gcc编译阶段要加上-g的参数,如想编译mian.c生成test的执行文件,可以输入下面命令

gcc -g mian.c -o test;

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是 运行时的内存地址。当你用 -g把调试信息加入之后,

并成功编译目标代码以后,就可以用gdb进行调试了。

2.在gdb中调试test的方法是:gdb test;

进入gdb调试之后,首先要设置断点,如果直接运行run会执行到程序的末尾;还可以进入gdb后通过file 命令来引入调试的程序,如test在目录/root 下,则file /root/test 也可达到同样效果。

a.设置断点的方式为

break <function>如在main函数设置断点,设置完成之后会有提示:

也可以指定源程序的某行设置断点,如break 10:会在程序的第十行设置断点

info breakpoint可以查看当前所有断点以及断点的情况,可以用disable与enable来分别设置取消和恢复某个断点,注意disable与enable的参数应该为info breakpiont命令中个断点对应的那个数字标号。delete 某个标号则直接删除了这个断点

break filename:linenum可以设置某个文件的某行为断点,list function可以查看特定函数的源码信息。

b.下面输入run命令就可以运行这个程序到main函数了,如果在run之前没有设置断点,则会一直执行程序,直到输出结果;

run命令还可以指定参数到标准输入,如run 1 2 3 4会向test传递四个参数。还可以通过set args来设定运行时参数,通过show args来查看当前参数。

c.运行到断点breakpoint后,step表示单步执行,如果在程序中调用其他函数,会跳出当前调试函数跟踪;next表示执行下一条语句,如果在程序中调用其他函数不会跳出该当前函数跟踪,也就是所有调用的函数都只是一个运算符对待。stepi和nexti是上面两个指令的汇编调试,每次只执行一条汇编语句。step与next后面都可以加上数字,表示一次执行的指令数。通过

d.通过bt可以查看当前函数调用的情况,finish可以一步跳出当前被执行函数,return到调用当前函数的函数,until可以一步执行完当前的循环体,continue可从当前位置继续执行到下一个断点位置。info stack与bt效果一样

e.print指令可以打印变量/表达式的值,如print a会打印出在当前范围内有效的变量a的值,另外print *a@num 命令可以打印出以a收地址的num长度的连续内存区域中的内容,

用display可以显示一些自动显示的变量,当程序停住或单步执行时,这些变量的值会自动打印。非常有用的一条display语句是 display /i $PC其中/i参数表示按汇编格式输出,pc为全局变量,为执行的指令,所以可以看到源代码与汇编相对应的输出。info display可以查看当前自动打印的信息,disable display dnum可以将当前打印取消,disable display dnum可以将当前打印恢复,undisplay dnum为取消某个自动打印,disable display dnum与undispaly dnum的打印效果一样,如果说区别,在于是否可以还将dnum对应的选项保留在display自动打印的选项中,可以通过info display来查看,dnum为某表达式在info display 中对应的数标。watch var设置观察点,当程序执行时,如果var变化时,会停止程序执行,打印变量信息,并等待下调gdb指令。rwatch是变量被读时暂停执行程序,awatch是在变量被读或者被写时暂停程序。info watchpoint 可以查看当前所有观察点。

print可以打印三种变量:全局变量--所有文件可见;静态变量--当前文件可见;局域变量--当前区域可见。

info local可以打印当前所有局部变量。

f.在help 后加指令名可以查看所有指令的用法。




0 0