參考:Clion遠程調試C++
Clion遠程調試的兩種方法:
- Clion本地與服務器端代碼同步后,服務器端通過gdbserver監聽端口,本地Clion連接調試
- Clion通過Toolchains實現遠端執行調試
(方法一未實踐,感覺略繁瑣,此處使用方法二)
1 下載ClickHouse代碼
此處將代碼解壓在本地:/Users/wyj/my_project/ClickHouse
同時,上傳至服務器:/mnt/ClickHouse
服務器項目目錄下創建.clion.source.upload.marker
文件
ssh ubuntu@10.10.7.2
touch /mnt/ClickHouse/.clion.source.upload.marker
可以不上傳至服務器,但會導致本地項目編譯時upload至服務器巨長時間。
若代碼在本地和服務器都存在,則可通過此步驟,解決第一次編譯時upload很慢問題。
2 Clion配置
配置Toolchains:Preferences->Build,Execution,Deployment->Toolchains
- 點加號,添加一個 Remote Host
- Credentials 設置服務器信息
- 其他配置會自動檢測
ClickHouse需要至少gcc11、g++11,如果默認不是這個版本,這里可以指定一下

配置CMake:Preferences->Build,Execution,Deployment->CMake
- 如果需要Cmake 有
-DCMAKE_BUILD_TYPE=Debug
參數,設定Build type為Debug
- Toolchain選擇我們上一步設置好的Toolchain
- ClickHouse使用Ninja編譯,這里Generator選擇
Ninja
,相當於Cmake添加-G Ninja
參數(cmake命令后會生成ninja規則) - Build directory可設置build目錄名稱

配置Deployment:Preferences->Build,Execution,Deployment->Deployment
-
若前兩步配置好了,此處會自動出現一個Remote development
-
設置Mapping:Local path為本地項目根目錄,Deployment path為服務器對應項目根目錄
默認 Deployment path 為/tmp/randomNumber


點擊apply后,會自動開始cmake。
若要在服務器端直接編譯:
cmake后,在/mnt/ClickHouse/cmake-build-debug 目錄下直接運行
ninja
(因為cmake ... -G Ninga 已經創建了build.ninja、rules.ninja)
3 設置項目更改自動同步服務器
勾選 Tools->Deployment->Automatic Upload(Always)

4 調試 ClickHouse(Clion調試)
點擊右上角,選擇Edit Configuration
:

clickhouse-server:
- 找到名為 clickhouse-server 的 Target
- Executor 選擇
clickhouse
執行文件 - 設置執行參數:server --config-file=/mnt/ClickHouse/temp_data/config.xml

config.xml文件模板在 ClickHouse/programs/server/config/xml
(需要更改其中注明的一些數據地址為本項目實際要存放的地址,如下圖)

clickhouse-client:
- 找到名為 clickhouse-client 的 Target
- Executor 選擇
clickhouse
執行文件 - 設置執行參數:client
- 默認用戶為default,密碼為空。設置用戶
-u username
,設置密碼--password 123
- 默認用戶為default,密碼為空。設置用戶

用戶信息由server的config.xml文件指定。用戶的users.xml模板在ClickHouse/programs/server/users.xml

以上,已設置好server和client,可直接在Clion進行運行/斷點調試。
5 調試 ClickHouse(服務器直接調試)
在服務器上調試ClickHouse,第一次時需要通過
ninja
命令編譯項目。
ClickHouse的可執行文件在:/mnt/ClickHouse/cmake-build-debug/programs 目錄下:
(/mnt/ClickHouse/cmake-build-debug為編譯目錄)

執行文件clickhouse
,運行后有很多供參數選擇,輸入不同的參數會去執行對應的可執行文件:

運行server:
./clickhouse-server --config=/mnt/ClickHouse/temp_data/config.xml # 方一
./clickhouse server --config=/mnt/ClickHouse/temp_data/config.xml # 方二
運行client:
./clickhouse client # -u username 設置用戶;--password 123 設置密碼
PS 服務器更新 gcc、g++
1 添加 ppa 到庫
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt install gcc-11 g++-11
2 更換ppa源(因為ppa太慢了)
ustc鏡像就有ppa的反向代理。
每個ppa都會在/etc/apt/sources.list.d 目錄下創建一個list文件。
只需要將其中的http://ppa.launchpad.net替換為http://launchpad.proxy.ustclug.org就行。
sudo vi /etc/apt/sources.list.d/ubuntu-toolchain-r-ubuntu-test-focal.list
sudo apt-get update
3 設置 gcc
# 首先要讓系統知道我們安裝了多個版本的g++
# 命令最后的 100是優先級,如果使用auto選擇模式,系統將默認使用優先級高的
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 100
# 使用交互方式的命令選擇默認使用的版本
sudo update-alternatives --config gcc
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 100
sudo update-alternatives --config g++
# 其他命令:
# 查詢系統中安裝有哪些版本
sudo update-alternatives --query g++
設置完成后,可執行 gcc --version
查看gcc版本。
PS2 錯誤 ld terminated with signal 9
服務器端直接編譯時(在/mnt/ClickHouse/cmake-build-debug 目錄下直接運行ninja
)報錯
collect2: fatal error: ld terminated with signal 9 [Killed]
產生原因:內存不足
解決方法參考:ld terminated with signal 9