0 gdb介绍
调试器GDB允许查看在执行一个程序时其内部时发生了什么,或者是程序奔溃(crashed)时它正在做什么。
- gdb通过以下四种事情来捕获某个行为的异常错误(bug):
运行程序,指定可能影响其动作的内容。 - 让程序在指定的情况下停止。
- 检查当程序停止时发生了什么。
- 改变程序中的内容,以便于更正一个错误,然后继续寻找下一个错误。
gdb可用于调试C,C++,Fortran,Modula-2。
gdb通过在终端执行gdb
命令激活。一旦启动,他从命令行读取命令,直到使用quit
命令让它退出。也可以通过使用help command
命令获取在线帮助。
gdb可以使用无参或者带参无选项执行,不过一般都使用带参的命令,例如:指定一个程序或者指定core文件:
gdb program #指定一个可执行程序
gdb program core #指定一个可执行程序以及core文件
gdb program pid #指定一个正在运行的程序
gdb -p pid #同上
1 gdb常用命令
1.1 list
list命令用于查看代码,可简写为l。
list #查看上一次list中心附近的10行代码,-5~+5
list n #查看第n行附近10行代码,n-5~n+5
list b,e #查看b,e行范围的代码
list function #查看函数function附近的代码
list file:line #查看文件file第line行附件的代码
list file:function #查看文件file的函数function附近的代码
list *address #地址为address的行附近的代码,使用info add name获取地址
1.2 break
break命令用于设置断点,可用b简化;delete用于删除断点,可用d简化。
break n #在第n行设置断点
break function #在函数function设置断点,可以是库函数
break file:line #在文件file第line行设置断点
break file:function #在文件file的function函数设置断点
break n if condition #根据条件在第n行设置断点,例如b 16 if i==10
break *address #在地址为address的行设置断点
1.3 delete和clear
每次使用break设置断点都会分配一个断点号,例如:
(gdb) b 16
Breakpoint 1 at 0x400512: file test.cc, line 16.
(gdb) b 17
Breakpoint 2 at 0x40051b: file test.cc, line 17.
要删除断点使用可以使用delete
命令:
delete [breakpoints num] [range...]
delete n #删除n号断点
delete m-n #删除m-n号断点
也可以使用clear
命令,clear是基于行的,不是删除所有断点:
clear n #删除n行的所有断点
clear function #删除函数function的断点
clear file:line #删除文件file第n行的所有断点
clear file:function #删除文件:函数的所有断点
1.4 查看变量
print
命令
print命令用来在调试程序时查看变量值,可简化为p。
print var #打印var的值
print *array@len #以{a, b, ...}格式打印动态数组
print array #以{a, b, ...}格式打印静态数组
print file::var or print function::var