程序
编写程序:
#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
命令替代