Linux下gdb调试学习
以test.cpp为例:
#include <iostream>
#include <vector>
int main() {
std::vector<int> as;
int sum=0;
for (int i = 0; i < 3; i++) {
sum+=i;
as.push_back(i);
}
std::cout<<sum<<std::endl;
std::cout << as[2] << std::endl;
return 0;
}
1、g++ 编译
下面是gcc/g++常用编译选项,我们的可执行文件要能够被gdb调试,必须在编译时加上调试信息,也即是加上-g选项
完整命令如下:
g++ -g test.cpp -o test
2、gdb调试
执行gdb test 进入gdb调试(种种作用和平时vs中调试本质上一样,只是变成了命令行而已)
如上可以看到命令行提示符为(gdb),接着我们就可以在这个gdb的命令行提示符上面输入各种gdb的调试命令了(补充:这里也可以在shell中输入gdb,然后回车,这样直接进入到gdb的调试命令行,之后可以通过file test命令来载入待调试的可执行程序)。
(1)查看源码 list(简写为l,小写的L)
最多显示10行,按回车键看接下来10行,以此类推。
(2)断点相关命令
break(简写b)命令, 在gdb下添加断点使用命令break或简写 b,有下面几个常见用法(这里统一用 b):
b 函数名
b 行号
b 文件名:行号
b 行号 if条件
举例:第8行添加断点,b 8
查看断点: info break
禁用和解禁断点: enable/disable 断点索引
删除断点:delete 断点索引
(3)启动程序
run简写为r
(4)查看变量的值
p <variable name>/print <variable name>
可以查看某一个变量的当前值,这个一般在程序单步调试或者打断点情况下有效否则为:
正确:
(5)单步执行
执行过程中设置为单步执行,n
(6)监控变量
使用watch <varible name>命令可以实现监控变量,使用info watch命令可以查看监控的变量。同时break所拥有的enable,disable,delete等动词对于watch依然使用,且用法大同小异。
(7)显示变量的值
使用display <varible name>命令可以在每一步执行之后打印变量的当前值,如下:
(8)可视化调试
在gdb命令行环境中输入wi命令,可以让我们进入可视化调试环境,这个环境可以看到源代码,所使用的调试命令与上面讲到的一致
这个界面完全就如同vs里面了,qt也是如此呢
Q:g++/gcc是这样,那么用cmake编译程序时如何使得程序支持gdb调试呢?
A: 解决方法如下所述
修改CMakeLists.txt文件,如我修改如下:
# Version 2.4 might work, but it won't find static libraries with odd names
cmake_minimum_required(VERSION 2.8)
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")