GDB调试入门备忘
GDB调试1、启动gdb:gdb 程序名 内存转存文件 例如:$ gdb hello core-q 不显示许可信息-d dirname dirname是目录名 告诉gdb查找源代码的目录,默认是当前目录 2、运行程序:命令run ,可以在run后面跟参数,如同程序参数一样。3、设置变量:使用set和unset来设置和取消环境变量,例如:set args arg1
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
更多推荐
所有评论(0)