ClickHouse 在 windows 下编译调试

什么是 ClickHouse

大数据时代,每一条数据都携带着一种信息,各种优传感器,网关,IOT 设备无时无刻都在用日志输出着自己的运行信息。这些信息被存储后经过多维度计算就组成了我们现在的大数据环境。为了便于计算,出现了非常多优秀的数据库及组件,他们都在自己擅长的领域解决着各种场景的问题,其中就有一款在 OLAP 场景下,以惊艳的性能指标横空出世的数据库, 这就是 ClickHouse 。
它是保守的俄罗斯一家商业公司 Yandex (类似中国的百度)在 2016 年开源的。今天我并不打算讲解 ClickHouse 有什么特性,因为当你首先对这款数据库感兴趣时,有志者肯定第一想法是,“Talk is cheap, Show me the code。” 但对于大型工程,代码下载是容易的,一些框架复杂,动态调用时才能清晰知道流程的项目,编译出来调试一次,会对逻辑有更深的理解,也会降低阅读难度,今天要讲的便是如何编译调试,尤其是在 windows 下利用强大的 Visual Studio 来调试 ClickHouse。

编译准备

我先预设大家的水平都会知道一些基础编译信息,这里只做要求:

  1. WSL 或者 CentOS 7, 我习惯于在 windows 下减少虚拟机消耗,这两者环境区别不大;
  2. GCC 7.4.0 ,ClickHouse 大量运用了 C++17 语法,要求编译器版本为 7.4;
  3. cmake 3.14.5, 这个下载包直接解压,建立软链即可
  4. ninja 1.9.0, 直接下载对应包,解压即可
  5. Visual Studio, 我用的是 VS2019

编译过程

下载源码

尽量在 linux 环境下(包括 WSL)使用 git 下载,应该 ClickHouse 引用了很多外部开源工程,在拉取过程中有些源文件是会建立软链接的,如果在 windows 下,这些软链接会建立失败,导致后期编译时错误。也不用直接在 git 上下载源码包,这样外部引用的开源工程都不会被拉取,造成编译不过。

// 拉取
git clone --recursive https://github.com/yandex/ClickHouse.git
cd ClickHouse

// 切换到 19.7 分支,或者一开始只拉取该分支代码
git tag -l
git checkout v19.7.3.9-stable

开始编译

mkdir build
cd build
cmake ..
ninja clickhouse

验证编译结果

dbms/programs/clickhouse server -V
ClickHouse server version 19.7.3.1

如果出现上面结果,那么你已经成功了。
但,还没有达到我们的目的,我们是需要在 windows 下调试起来。

调试编译准备

为什么要重新编译

由于默认情况下,ClickHouse 是编译成静态模块,打包成一个大程序。为了便于后期更改代码调试时减少链接时间,我们修改为编译为动态链接库的形式,这样也可以逐模块探索。还有,默认情况下,ClickHouse 是非 DEBUG 模式的,由于在内存管理这块,在 DEBUG 和非 DEBUG 模块下启用的是不同算法。我们打算非调试的模块依然用 ninja 调用 gcc 这一套编译成 so 库,在需要修改的代码处用 Visual Studio 编译,而 Visual Studio 在调试时,一般会是 DEBUG 模块,所以其它模块(ninja)在编译时,我们预先改成 DEBUG 模式。

修改 CMake 配置文件

修改根目录下 CMakeLists.txt, USE_STATIC_LIBRARIES 为 FALSE。

option (USE_STATIC_LIBRARIES "Set to FALSE to use shared libraries" FALSE)

重新编译

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug 
ninja -j 4

检查编译结果

如果在 build/dbms 下面出现了 libdbmsd.so 库,说明编译成功!

创建 VS 工程

目前来讲,我们应该有了全量代码,很多模块已经编成了 so 库,我们现在要做的就是,添加一个 main.cpp 文件,调用接口跑起来我们关注的部分就成功了。

创建工程

在根目录下创建 ClickHouse.sln, ClickHouse.vcxproj 两个工程,工程类型为 Linux 工程,然后打开 VS 工程。如下图:
在这里插入图片描述
注意:我用的是显示所有文件视图,并添加了一个 main.cpp 文件, 代码如下,也是 Parser 下的测试用例。

#include <iostream>

#include <Parsers/ParserQueryWithOutput.h>
#include <Parsers/parseQuery.h>
#include <Parsers/formatAST.h>


int main(int, char **)
try
{
    using namespace DB;

    std::string input =
        " SELECT 18446744073709551615, f(1), '\\\\', [a, b, c], (a, b, c), 1 + 2 * -3, a = b OR c > d.1 + 2 * -g[0] AND NOT e < f * (x + y)"
        " FROM default.hits"
        " WHERE CounterID = 101500 AND UniqID % 3 = 0"
        " GROUP BY UniqID"
        " HAVING SUM(Refresh) > 100"
        " ORDER BY Visits, PageViews"
        " LIMIT LENGTH('STRING OF 20 SYMBOLS') - 20 + 1000, 10.05 / 5.025 * 5"
        " INTO OUTFILE 'test.out'"
        " FORMAT TabSeparated";

    ParserQueryWithOutput parser;
    ASTPtr ast = parseQuery(parser, input.data(), input.data() + input.size(), "", 0);

    std::cout << "Success." << std::endl;
    formatAST(*ast, std::cerr);
    std::cout << std::endl;

    return 0;
}
catch (...)
{
    std::cerr << DB::getCurrentExceptionMessage(true) << "\n";
    return 1;
}

配置远程编译器

在 VS 的工具/选项下面配置一个远程管理器,这是 VS 的一个特性,可以通过 ssh 调用远端 gcc 和 gdb 用来编译调试 linux 程序。
在这里插入图片描述

配置工程

配置头文件

配置头文件的列表,建议为编译时看看头文件在哪里,再添加进去,然后重复上面的动作直至全部添加为止。待添加的头文件部分如下图:
在这里插入图片描述

配置链接库

在这里插入图片描述
把编译出来的库文件添加进来。需要注意的是,这里的库文件在存在于目标 linux 机器上。

调试运行

在这里插入图片描述

如果能如上图断点被命中,恭喜你,至此整个调试环境已经可以跑起来了!

调试技巧

当想要了解某一个模块时,可以利用 VS 把想调试的源文件添加进工程中(默认是全部排除的),这时该文件会被 VS 自动拷贝到远端,并参与到工程编译中,此时就可以对该文件打断点调试了。

结束

尽情利用源码来探究 ClickHouse 吧,源码面前没有秘密!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows编译iperf3有一些步骤需要遵循。首先,您需要安装适当的编译工具。 1. 在Windows中,您可以选择使用MinGW或Cygwin来提供编译工具链。此外,您还需要一个CMake实例来生成编译配置。 2. 首先,您需要从iperf3的官方存储库中获取源代码。您可以从GitHub上的https://github.com/esnet/iperf下载最新的源代码压缩文件。 3. 解压缩您下载的源代码文件,并将其放在一个方便的地方。 4. 打开CMake并设置源代码路径为您解压的iperf3文件夹路径。 5. 接下来,您需要设置生成路径。您可以选择在源代码文件夹内创建一个新的文件夹,例如“build”,用于存放生成的文件。 6. 点击“Configure”按钮,选择您想要使用的生成工具。在这里,您可以选择使用MinGW Makefiles或MSYS Makefiles。 7. 完成配置后,点击“Generate”按钮,CMake将为您生成相应的构建系统。 8. 现在,您可以使用命令提示符或终端,导航到生成文件夹中。 9. 运行适当的构建命令以编译iperf3。对于MinGW,您可以使用“mingw32-make”命令,而对于MSYS,您可以使用“make”命令。 10. 构建完成后,您将在生成文件夹中找到生成的可执行文件“iperf3”。从这里,您可以使用该可执行文件来运行iperf3。 需要注意的是,在Windows编译iperf3可能需要一些额外的依赖项。您需要确保在进行编译之前,您已经安装了所有必需的依赖项,并将其正确地设置给编译工具。您可以在iperf3的官方文档中找到有关编译依赖项的更多信息。 总结起来,编译iperf3在Windows中需要安装适当的编译工具,并按照适当的步骤进行配置和构建。完成后,您可以在生成的文件夹中找到可执行文件,并使用它来运行iperf3。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值