#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 的目的。