GDB调试
1、list命令
在gdb中运行list命令(缩写l)可以列出代码,list的具体形式包括:
list <linenum> ,显示程序第linenum行周围的源程序,如:
(gdb) list 15
10
11 int array1[10] =
12 {
13 48, 56, 77, 33, 33, 11, 226, 544, 78, 90
14 };
15 int array2[10] =
16 {
17 85, 99, 66, 0x199, 393, 11, 1, 2, 3, 4
18 };
19
list <function> ,显示函数名为function的函数的源程序,如:
(gdb) list main
2 {
3 return a + b;
4 }
5
6 main()
7 {
8 int sum[10];
9 int i;
10
11 int array1[10] =
list,显示当前行后面的源程序。
list - ,显示当前行前面的源程序。
2、run命令
在gdb中,运行程序使用run命令。
· 程序运行参数
set args 可指定运行时参数,
如:set args 10 20 30 40 50;show args 命令可以查看设置好的运行参数。
· 运行环境
path
· 工作目录
cd
· 程序的输入输出
info terminal 用于显示程序用到的终端的模式;gdb中也可以使用重定向控制程序输出,如run > outfile;
tty命令可以指定输入输出的终端设备,如:tty /dev/ttyS1。
3、break命令
在gdb中用break命令来设置断点,
break |
在进入指定函数时停住,C++中可以使用class::function或function(type, type)格式来指定函数名。 |
---|---|
break |
在指定行号停住。 |
break +offset / break -offset | 在当前行号的前面或后面的offset行停住,offiset为自然数。 |
break filename:linenum | 在源文件filename的linenum行处停住。 |
break filename:function | 在源文件filename的function函数的入口处停住。 |
break *address | 在程序运行的内存地址处停住 |
break | break命令没有参数时,表示在下一条指令处停住。 |
4、单步命令
在调试过程中,next命令用于单步执行,类似VC++中的step over。next的单步不会进入函数的内部,与next对应的step(缩写s)命令则在单步执行一个函数时,会进入其内部,类似VC++中的step into。下面演示了step命令的执行情况,在23行的add()函数调用处执行step会进入其内部的“return a+b;”语句:
(gdb) break 25
Breakpoint 1 at 0x8048362: file gdb_example.c, line 25.
(gdb) run
Starting program: /driver_study/gdb_example
Breakpoint 1, main () at gdb_example.c:25
25 sum[i] = add(array1[i], array2[i]);
(gdb) step
add (a=48, b=85) at gdb_example.c:3
3 return a + b;
step |
单步跟踪,如果有函数调用,则进入该函数(进入函数的前提是,此函数被编译有debug信息)。step后面不加count表示一条条地执行,加表示执行后面的count条指令,然后再停住 |
---|---|
next |
单步跟踪,如果有函数调用,它不会进入该函数。同样地,next后面不加count表示一条条地执行,加表示执行后面的count条指令,然后再停住 |
set step-mode | set step-mode on用于打开step-mode模式,这样,在进行单步跟踪时,程序不会因为没有debug信息而不停住,这个参数的设置可便于查看机器码。set step-mod off用于关闭step-mode模式 |
finish | 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息 |
until | 一直在循环体内执行单步,退不出来是一件令人烦恼的事情,until命令可以运行程序直到退出循环体 |
stepi(缩写si)和nexti(缩写ni) | stepi和nexti用于单步跟踪一条机器指令,一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。 另外,运行“display/i $pc”命令后,单步跟踪会在打出程序代码的同时打出机器指令,即汇编代码 |
5、continue命令
当程序被停住后,可以使用continue命令(缩写c,fg命令同continue命令)恢复程序的运行直到程序结束,或到达下一个断点
6、print命令
在调试程序时,当程序被停住时,可以使用print命令(缩写为p),或是同义命令inspect来查看当前程序的运行数据。