Duangw

gdb

索引:

  1. 命令行
  2. 常用选项
  3. 运行程序
  4. 查看代码
  5. 检查数据
  6. 设置断点
  7. 单步执行
  8. 函数调用
  9. 查找
  10. shell
  11. 调试正在运行的程序

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中运行了一个程序,而又要附加到另外一个运行的进程上,那么必须杀死目前运行的这个程序。