clion
#include <stdio.h>
#include <stdlib.h>
static int * g_count = NULL;
__attribute__((constructor)) void load_file()
{
printf("Constructor is called.\n");
}
__attribute__((destructor)) void unload_file()
{
printf("destructor is called.\n");
}
int main()
{
int d = 11;
d++;
printf("this is main function %d\n", ++d);
return 0;
}
CLion 是 JetBrains IDE 全家桶产品之一,可以用来开发 C/C++ 项目,而 GDB 则可以用来对 C/C++ 程序进行调试。
作为一款调试器,GDB 为程序开发人员提供了强大的调试功能,但却需要使用命令来执行调试操作,操作起来不是很方便。(有关 GDB 的使用,可以参考文章《GDB 调试》。)为此,CLion 为程序开发人员提供了图形化的调试界面以方便调试。另外,CLion 还提供了远程调试的功能。因为在实际项目中,我们常会碰到在本地开发环境编写代码,程序却在远程机器运行的情况。远程调试功能对我们来说是十分必要的。
本文讲述如何使用 CLion 来实现远程调试。
环境准备
假设本地开发环境是 Windows 操作系统,程序远程执行环境是 CentOS 操作系统。为满足远程调试,需要在 CentOS 上安装必要的软件,安装的软件包括:
- cmake
- gcc
- gdb
- gdbserver
安装命令如下:
yum install cmake -y
yum install gcc-c++ -y
yum install gdb -y
yum install gdb-gdbserver -y
- 1
- 2
- 3
- 4
cmake 用于管理编译过程,生成 Makefile 文件;gcc-c++ 是编译器;gdb 是个调试工具,程序调试功能实际上就是由 gdb 提供的;gdbserver 用于监听某个 TCP 端口,允许远程主机连接,以实现远程调试功能。
至于本地开发环境,Windows 操作系统上安装好最新版本的 CLion ,以笔者为例,当前 CLion 最新版本为 2018.3。
代码同步
使用 CLion 创建一个 C++ 项目 helloworld。然后,打开菜单 Tools - Deployment - Configuration,配置远程主机以及本地目录与远程目录的映射关系:
右键项目文件夹,选择 Deployment - Upload to 10.88.115.114,便将项目源代码上传至 10.88.115.114 主机上。
上述我们配置了远程主机与本地主机目录映射,因此执行上传操作后,可以看到源代码已被上传至上述配置的目录中。
代码编译
CLion 为我们生成了默认的源代码main.cpp
,修改 main.cpp
,增加一个 add
函数,方便展示调试功能:
#include <iostream>
using namespace std;
int add(int a, int b)
{
int sum = a + b;
return sum;
}
int main() {
std::cout << "Hello, World!" << std::endl;
int sum = 0;
sum = add(5, 3);
std:cout << "sum of 5 and 3 is " << sum << std::endl;
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
修改 main.cpp
源代码后,需要重新将代码上传至远程机器。
CLion生成的 CMakeLists.txt
如下,使用 C++98 标准,指定生成的可执行文件名为 helloworld
:
project(helloworld)
set(CMAKE_CXX_STANDARD 98)
add_executable(helloworld main.cpp)
- 1
- 2
- 3
- 4
- 5
由于上面我们已将源代码上传至 10.88.115.114 主机,进入 10.88.115.114 目录 /home/lihao/code/cpp/hello,然后执行以下操作:
$ cd /home/lihao/code/cpp/hello
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Debug
$ make
- 1
- 2
- 3
- 4
- 5
执行 cmake
命令会生成 Makefile 文件,指定 -DCMAKE_BUILD_TYPE=Debug
是为了支持 gdb 调试。
执行 make
命令会在 build
目录下编译生成可执行文件:helloworld。
远程调试
经过上述的操作步骤,接下来我们就可以实施远程调试了。
在远程主机继续执行命令:
gdbserver :1234 /home/lihao/code/cpp/hello/build/helloworld
- 1
即指定 gdbserver 监听端口 1234,输出:
Process /home/lihao/code/cpp/hello/build/helloworld created; pid = 12496
Listening on port 1234
返回本地 CLion,配置远程调试信息,增加一个 GDB Remote Debug 配置:
然后输入以下配置信息:
设置断点,按下调试按钮,可以看到程序已被执行起来,且中断在断点处,可以看到变量值:
需要指出的是,helloworld 程序的运行是在远程主机,并不是本地主机,CLion 通过向 gdbserver 发送调试命令从而达到控制远程主机上的 gdb 的目的。