Gdb for Debugging C and C++

Abstract

GDB(from GNU) is a command line tool to debug your programs step by step.
GCC is GNU Compiler Collection. it could compile many languages, including c, c++, java, fortran, pascal, etc.

gcc/g++

GCC contains both gcc and g++.
And actully they have common for compiling c++.
Differences are:

  • gcc is GNU C Compiler, gcc would *.c as c file, and treat *.cc as cpp file(grammer has difference).
  • g++ is GNU C++ Compiler, g++ would treat both *.c and *.cc as cpp file. and g++ would link STL by default.

So the suggestion is compile c project with gcc, compile c++ project with g++.

Some useful compile options shown as below, assuming source file is main.cc.

  • preprocessing with -E

    1
    g++ -E -o main.i main.cc
  • compiling to assembly code with -S

    1
    g++ -S -o main.s main.cc
  • compiling to machine code with -c

    1
    g++ -c -o main.o main.cc
  • link to machine code without option

    1
    g++ -o main.out main.o
  • the most common usage: combination of compiling to machine code and link machine code

    1
    g++ -o main.out main.cc

gdb

in order to apply gdb, you need to insert debug information when compiling with -g option.

1
g++ -g -o main.out main.cc

useful command for gdb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
gdb 常用命令
(1) gdb 可执行文件 : 表示对某个文件进行调试
(2) b 函数名/行数 : 在某个函数名或行数前设置断点
(3) run/r : 表示开始运行,如果是正在调试的程序的话,表示再次进行调试
(4) n/next : 表示执行下一行语句
(5) l/list : 列出源码默认10行(当前位置的上下共10行)
list 行号 : 列出行号上下共10行的源码
list 函数名 : 列出函数名上下共10行的源码
(6) s/step : 表示单步执行,进入函数
(7) p /x 变量名 : 按16进制输出变量的值
/d : 按10进制
/o : 按八进制
(8) set var 变量名=值 : 设置变量的值
(9) bt(backtrace) : 查看各级函数调用及参数,简写bt
(10)q/quit : 退出
(11)finish : 连续运行到当前函数返回为止,然后停下来等待命令
(12)continue/c : 跳转到下个断点,或者跳转到观察点
(13)ptype 变量名 : 可以查看变量的类型,简写为pt
(14)watch
作用:一般用来观察某个变量/内存地址的状态(也可以是表达式),
如可以监控该变量/内存值是否被程序读/写情况。
有三种方法:
1.watch expr(指定变量/内存地址/表达式)
一旦expr的值有变化时,将停住程序。
2.rwatch expr
当expr被读时,停住程序。
3.awatch expr
当expr被读或被写时,停住程序。
watch使用步骤:
1. 使用break在要观察的变量所在处设置断点;
2. 使用run执行,直到断点;
3. 使用watch设置观察点;
4. 使用continue观察设置的观察点是否有变化。
(15)start : 开始执行程序,停在main函数第一行语句前面等待命令
(16)info watchpoints : 列出所有观察点
info breakpoints : 查看当前设置的所有断点
(17)d/delete [breakpoinsts num] [rang...]
d/delete : 删除所有断点
d/delete num : 删除breakpoints为num的断点
d/delete num1-num2 : 删除breakpoints为num1-num2的断点
(18)enable num : 启用num号断点
(19)disable num : 关闭num号断点
(20)u/until : 结束当前循环
————————————————
版权声明:本文为CSDN博主「Linux猿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/nyist_zxp/article/details/81429615


(21)x/examine : check bit level data in given memory address
x 是 examine 的缩写
n表示要显示的内存单元的个数
f表示显示方式:
x 按十六进制格式显示变量
d 按十进制格式显示变量
u 按十进制格式显示无符号整型
o 按八进制格式显示变量
t 按二进制格式显示变量
a 按十六进制格式显示变量
i 指令地址格式
c 按字符格式显示变量
f 按浮点数格式显示变量
u表示一个地址单元的长度
b 单字节
h 双字节
w 四字节
g 八字节
例子:
x /1dw address
从内存地址address读取内容,显示一个4字节的十进制整数