皓月星空

导航

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

可设定程序的运行路径;how paths可查看程序的运行路径;set environment varname [=value]用于设置环境变量,如set env USER=baohua;

· 工作目录

cd

相当于shell的cd命令;pwd 显示当前所在的目录。

· 程序的输入输出

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来查看当前程序的运行数据。

posted on 2021-11-22 23:47  皓月星空  阅读(51)  评论(0编辑  收藏  举报