Bootstrap

Linux下gdb调试学习

                                 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")

 

 

;