IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 如何在Mac OS下调试ClickHouse源码 -> 正文阅读

[系统运维]如何在Mac OS下调试ClickHouse源码

如何调试ClickHouse源码

本文介绍ClickHouse源码的编译安装,并介绍了如何通过lldb来调试Clickhouse。

安装依赖的包和工具

$ brew install cmake ninja libtool gettext

下载源码

源码比较大,可能时间比较长一些。

$ git clone --recursive https://github.com.cnpmjs.org/ClickHouse/ClickHouse.git

# 若是中断可以使用以下命令
$ git fetch  --recurse-submodules
$ git submodule update --init --recursive

#或
$ git submodule update --init --recursive && git pull --recurse-submodule

下载mac os的编译器

我这里使用的是Xcode 的原生 AppleClang 编译器进行构建,所以需要安装llvm。

若想使用其他的编译器可以参考这里的说明:
https://clickhouse.tech/docs/en/development/build-osx/

注意:这一步比较关键,编译时出现的各种问题,很多都是由于这一步没有安装,或则编译器指定不对。

$ brew install llvm

编译Clickhouse源码

注意:这一步需要指定已经安装的编译器来进行编译。

$ mkdir build
$ cd build
$ CC=$(brew --prefix llvm)/bin/clang CXX=$(brew --prefix llvm)/bin/clang++ cmake -DCMAKE_BUILD_TYPE=Debug  ..

若没有任何错误,编译完成后的可执行代码在:ClickHouse/build/programs文件夹中,通过ls命令查看一下:

$ cd ClickHouse/build/programs
$ ls -lt
lrwxr-xr-x  1 user1  g1    10B  8  1 18:07 clickhouse-format -> clickhouse
lrwxr-xr-x  1 user1  g1    10B  8  1 18:07 clickhouse-benchmark -> clickhouse
lrwxr-xr-x  1 user1  g1    10B  8  1 18:07 clickhouse-local -> clickhouse
lrwxr-xr-x  1 user1  g1    10B  8  1 18:07 clickhouse-copier -> clickhouse
lrwxr-xr-x  1 user1  g1    10B  8  1 18:07 clickhouse-extract-from-config -> clickhouse
lrwxr-xr-x  1 user1  g1    10B  8  1 18:07 clickhouse-client -> clickhouse
lrwxr-xr-x  1 user1  g1    10B  8  1 18:07 clickhouse-compressor -> clickhouse
lrwxr-xr-x  1 user1  g1    10B  8  1 18:07 clickhouse-server -> clickhouse
lrwxr-xr-x  1 user1  g1    10B  8  1 18:07 clickhouse-obfuscator -> clickhouse
-rwxr-xr-x  1 user1  g1   906M  8  1 17:57 clickhouse

可以看到clickhouse-server等应用程序都连接到clickhouse这个可执行文件。也就是说clickhouse是所有程序的入口。

为了可以调试代码,我们在编译时添加了 -DCMAKE_BUILD_TYPE=Debug 选项,所以该文件中包含了调信息,导致文件很大。

下面就可以来调试Clickhouse的源码了。

调试Clickhouse

在Mac OS下,我们使用lldb来调试clickhouse。也可以使用gdb来调试,不过gdb需要授权。lldb可以有两种调试方式,一种是在程序启动时进行调试;还有一种是通过attach到正在运行的某个进程id来进行调试。

这里我们采取程序启动进行调试的方式来观察和调试Clickhouse的源码。

先进入我们刚才编译好Clickhouse的可调试的二进制文件,再通过lldb的命令进行调试。操作如下:

$ cd ClickHouse/build/programs
$ lldb ./clickhouse-server
# 打一个断点,在main函数
(lldb) b main
# 运行main函数
(lldb) r --config-file ../../programs/server/config.xml
# 单步执行
(lldb) n
# 查看执行到哪一步了,并打印调用栈
(lldb) bt
# 进入一个函数的内部
(lldb) s

查看其输出

(lldb) b main
Breakpoint 2: 7 locations.

(lldb) r --config-file ./programs/server/config.xml
Process 16763 launched: '/Users/hover/opensrc/ClickHouse/build/programs/clickhouse-server' (x86_64)
Process 16763 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 2.1
    frame #0: 0x0000000100002039 clickhouse-server`main(argc_=3, argv_=0x00007ffeefbff560) at main.cpp:374:17
   371 	
   372 	int main(int argc_, char ** argv_)
   373 	{
-> 374 	    inside_main = true;
   375 	    SCOPE_EXIT({ inside_main = false; });
   376 	
   377 	    /// Reset new handler to default (that throws std::bad_alloc)
Target 0: (clickhouse-server) stopped.


(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 2.1
  * frame #0: 0x0000000100002039 clickhouse-server`main(argc_=3, argv_=0x00007ffeefbff560) at main.cpp:374:17
    frame #1: 0x00007fff6915008d libdyld.dylib`start + 1

这样就可以观察Clickhouse-server的函数调用关系了。

Clickhouse用到了多线程,如何使用lldb来调试多线程,可以自行百度一下。

问题解决

错误1:Cannot find objcopy.

没有找到objcopy命令,请安装objcopy工具。

错误2:

AppleClang is not supported, you should install clang from brew.

在cmake时指定特定的编译工具。

小结

本文讲述了如何在Mac OS下编译和调试Clickhouse源码,通过本文就可以对Clickhouse的代码进行调试。欢迎进入Clickhouse的源码世界。

参考资料

  • https://clickhouse.tech/docs/zh/development/build-osx/

  • https://clickhouse.tech/docs/en/development/build-osx/

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-02 11:10:24  更:2021-08-02 11:12:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 23:52:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码