01GDB基本使用


1. 产生带有调试符号的二进制

2. 启动gdb

1)启动命令

2)表示Reading symbols 成功,表示加载调试符号成功。

3. 基本命令如下:

1). 查看源代码:list/l
2). 在函数上设置断点 b main,就在main函数的第一行设置了断点
3). 在文件上设置断点 b a.cpp:8,就是在a.cpp文件的第8行设置了断点
4). 查看已经设置的断点信息: i b
5). 将程序运行起来命令:r
6). 下一行:n
7). 查看变量: p 变量名字
8). 显示当前函数的所有局部变量:i locals,没有执行到的局部变量值会显示成乱码
9). 执行到下一个断点: c

10). 退出gdb: q

11). s 进入当前行调用的函数

12). finish:执行完当前函数,回到调用该函数的地方
13). detach:退出gdb, 但是当前被调试的进程可以继续向下执行, 而q/quit命令,是立刻结束当前被调试的进程

14)info args: 查看当前函数的参数

15)set print pretty: 可以在查看对象属性的时候,一行一个属性的方式显示,不是都显示在一行.
16)修改变量的值, eg: p i=200, 这样就将变量i的值改为了200,通过动态修改变量的值,可以使程序走到不同的分支

 17) 在gdb过程中,可以通过 call function_name(1, 2) 或者 p function_name(1, 2) 这两种形式调用函数,且可以对被调用函数进行断点,如果没有调试符号调试,则需要对返回值类型进行转化为正确的类型,才可以正常调用。

18)skip 函数:该命令,在执行step操作的时候,不会进入该函数。

19) 6. disassemble,该命令用于查看当前方法的汇编

3. GBD调试程序传入参数,有如下三种方式:
1)启动gdb的时候指定参数:gdb --args program p1 p2 "p3 _p3",其中program是要被调试的程序
2)执行gdb命令r之前:set args p1 p2 "p3 _p3",本次设置了3个参数,参数有空格,要使用引号引起来
3)执行gdb命令r时:r p1 p2 "p3 _p3",该方式执行后,在下次执行r的时候就不需要再次设置了,除非需要改动上次的设置

4. 调试已经存在的进程:其中红色pid是要被调试的进程id

1)gdb attach pid
2)gdb --pid pid

5.【info命令】

info sources 查看所有源文件:
info sources -basename test 查找文件名包含test的源文件
info sources -dirname abc 查抄目录名包含abc的源文件
info proc 查看当前运行进程
info variables abc 查看全局变量或者静态变量定义的文件,如果静态变量在某个函数内定义,则只能显示出他所在的函数,显示不了他所在的文件

6.【设置源码位置】
如果要调试二进制记录的源码的文件位置和当前机器上的源码位置不一致
可以在进入gdb之后,使用:directory 【source_code_root_path】来设置搜索路径
但是如果编译出来的二进制是绝对路径,我们是需要将源码放到gdb看到的路径中的,
否则无法调试

特别注意:

  1). 在gdb中,直接回车是执行上一次输入的命令

  2). help gdb命令,可以查看该gdb命令的帮助

GDB