gdb
索引:
1.命令行
gdb progname [ corefile | pid ];
2.常用选项
-d dirname:指定源代码的目录,缺省在当前目录下。
-q(--quiet):不显示许可信息。
3.运行程序
(1).命令
run [ arg1 arg2 … ];
(2).参数
除了在run时指定参数外,也可使用set命令:
set args arg1 arg2 …;
(3).设置环境变量
set environment env1 env2 …;
4.查看代码
(1).backtrace
命令backtrace(back)查看导致错误的函数树。
(2).list
命令list[m,n]显示代码的上下文,m和n是显示代码段的起始行和结束行。不带参数的list显示当前行附近的10行代码。
5.检查数据
(1).显示变量值
命令print。
举例:
print num;
打印变量num的值。
print $1 - 1;
$1和$2是被检查数值的历史纪录项。
print ary@10;
打印从ary开始的头10个内存区域。
print ary[0]@10
打印数组ary的头10个值,注意与上例的区别。
(2).变量类型
命令whatis。
(3).变量类型的定义
命令ptype。
(4).更改变量的值
set variable varname = value;
如:
set variable I = 10;
(5).变量的作用域和上下文
如果某个函数(称为控制函数)正在执行或者该函数将控制流程传给一个由控制函数调用的函数,那么该函数里的局部变量处于活动状态。
全局变量不管程序是否运行总是活动的。
非全局变量是非活动的,除非程序运行。
静态变量是局部于文件的,标示的方法如下:
‘file'::varname;
funcname::varname;
如:
print ‘foo.c’::baz; print &blat::idx;
6.设置断点
(1).根据行号设置断点
break linenum;
(2).根据函数名设置
break funcname;
(3).在指定文件内部设置
break filename: linenum;
break filename: funcname;
(4).条件断点
break linenum(funcname) if expr;
如:
break 24 if I == 15;
(5).在断点后继续执行
命令continue。
(6).显示断点信息
info breakpoints。
(7).删除断点
delete break-no;
(8).使断点无效/有效
disable/enable break-no;
7.单步执行
(1).step
step命令一次执行一条语句,遇到函数调用将进入函数;
(2).next
next命令一次执行一行,不进入函数。
8.函数调用
(1).call
call name(args),调用并执行名为name,参数为args的函数。
(2).finish
如果可以,则中止当前函数并打印它的返回值。
(3).return
return value,停止执行当前函数,并将value返回给调用者。
(4).where
显示逆序的函数调用链。
(5).up
将调用栈上移一个函数调用。
(6).down
将up调用上移的栈移回。
9.查找
(1).search
search <字符串>,查找一个特定字符串在当前文件中的下一次出现。
(2).reverse-search
反向查找。
10.shell
shell command;
执行shell命令。
11.调试正在运行的程序
(1).附加到进程
gdb progname pid; 或 使用attach和file命令。
附加到一个正在运行的进程将自动将其停止以便能使用常规的gdb命令检查它的状态。
(2).与进程分离
detach或quit命令。从进程分离并允许它继续执行。
如果已经在gdb中运行了一个程序,而又要附加到另外一个运行的进程上,那么必须杀死目前运行的这个程序。