调试:设置断点

程序

编写程序:

#include <stdio.h>
int main(int argc, char** argv)
{
    unsigned long long int n, sum;
    n = 1;
    sum = 0;
    while (n <= 100)
    {
        sum = sum + n;
        n = n + 1;
    }
    return 0;
}

将程序编译成可执行文件:

# 使用 GDB 调试某个可执行文件,该文件中必须包含必要的调试信息(比如各行代码所在的行号、包含程序中所有变量名称的列表(又称为符号表)等)。因此必须有-g
# -o main:生成可执行文件main
 gcc main.cpp -o main -g

准备

启动gdb调试器调试尚未执行的程序(-q表示屏蔽免责条款)

$ gdb main -q
Reading symbols from /home/oceanstar/workspace/cpp/code/opencv_sln/main...(no debugging symbols found)...done.
(gdb) 

设置断点可以在函数名和行号等上设置断点。程序运行后,到达断点就会自动暂停运行。此时可以查看该时刻的变量值、显示栈帧、重新设置端点或者重新运行等。断点命令(break)可以简写为b

断点可以通过函数名、当前文件内的行号来设置,也可以先指定文件名在指定行号,还可以指定与暂停位置的偏移量,或者用地址来设置。
调试:设置断点

调试:设置断点

设置好的断点可以通过info break确认

调试:设置断点

b 行号

显示带行号的源代码:l

  • 默认情况下,l 选项只显示 10 行源代码,如果查看后续代码,安装 Enter 回车即可
  • 注意,必须由源文件才能显示源代码,还有,切记不要将编译的二进制文件重命名

调试:设置断点

在第 7 行源代码处打断点: b 7
调试:设置断点
运行程序,遇到断点停止: r
调试:设置断点
查看代码中变量 n 的值: p n

(gdb) p n
$1 = 1  # 当前 n 的值为 1,$1 表示该变量所在存储区的名称

在第 7行的基础上,在第9行打断点: b 7

调试:设置断点

b 函数名

调试:设置断点
运行(run):不加参数只执行run,就会执行到了断点的位置之后暂停运行。可以简写为r

start命令:经常遇到的一个操作是在main函数上设置断点(b main),然后执行到main()函数(r)。这个操作可以用start命令替代

上一篇:GDB调试结果和直接运行结果不一致


下一篇:GDB常用命令整理