GDB调试

1、启动gdb:gdb 程序名 内存转存文件 例如:$ gdb hello core

-q 不显示许可信息

-d dirname dirname是目录名 告诉gdb查找源代码的目录,默认是当前目录 

2、运行程序:命令run ,可以在run后面跟参数,如同程序参数一样。

3、设置变量:使用set和unset来设置和取消环境变量,例如:

set args arg1 arg2 ...   被调试的程序需要的选项和参数

set environment env1 env2 ... 设置环境变量

4、帮助:使用help 或 help all命令来获得帮助

5、调试中查看代码和错误信息:

(gdb)backtrace  追踪错误,生成导致错误的函数树 可以简写为back

(gdb)list 查看错误首次出现的位置 不带参数的list命令默认是附近10行代码,list [m,n] m和n是错误首次出现位置的代码段的起始行和结尾行的行号

6、检查数据:

gdb能够显示被调试程序中几乎任何表达式、变量或者数组的类型和值。

使用方法:print 表达式

使用$1,$2...来检查数值的历史记录项,例如:print $1 或print $1-1

使用数组名@N,来打印数组开头N个内存地址值,例如:print ary@10

使用数组名[下标]@N,来打印数组下标开始的N个元素的值,例如:print ary[1]@5 打印ary第一个元素开始的5个数组元素值

whatis 查看变量类型,例如:whatis ary

7、设置断点:

gdb允许行号,函数名设置断点,还可以设置条件断点。

行号设置断点:break linenum 或 break filename:linename

函数名设置断点:break funcname 或 break filename:funcname

条件断点:break linenum if expr 例如:break 15 if i==12

 break funcname if expr

设置断点后可以使用run来运行程序,会提示是否重新开始,选择yes/y

之后可以使用continu 命令继续运行程序调试。

使用info breakpoints 命令来查看设置了那些断点以及那些断点已经被触发。

delete  N :允许删除断点,N是断点号;不指定断点号则删除所有断点。例如:delete 3 

disable N :使断点无效,,N是断点号;不指定断点号则屏蔽所有断点。例如:disable 3

enable N :重新使无效的断点有效,N是断点号;不指定断点号则使所有断点有效。例如:enable 3


ptype 变量名 :查看变量详细的类型

set variable 变量名=值 :给一个变量设置新值

next :遇到一个函数时,next命令执行整个函数

step :单步进入函数,每次仍然执行一个语句。

call name(args) :调用并执行名为name,参数为args的函数

finish:如果可以,,则终止当前函数并打印它的返回值

return value:停止执行当前函数,并将value返回给调用者。


8、gdb的高级用法:

file::varname:file是源文件名称(使用时要用单引号),varname是想要引用的变量名称。例如:print 'foo.c'::baz

funcname::varname:funcname是函数名称(使用时要用&符开头)。例如:print &func::idx

9、遍历函数堆栈:

where:打印出逆序的函数调用链

up:将调用栈上移一个函数调用

down:控制移回由up上移的函数

10、操纵源代码:

gdb -d 目录 -d 目录:可以使用一个或多个-d<路径>选型启动gdb,来指定多个源代码搜索路径

search <字符串> 查找特定字符串在当前文件中下一次出现

reverse-search return 反向查找

11、与shell通信

shell 命令 即可执行shell命令

12、附加到某个运行中的程序

gdb 程序名称 PID 来启动

如果已经启动gdb,可以使用file和attach

file 程序名称

attach PID

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐