这是我参与更文挑战的第1天,活动详情查看:更文挑战
build
记录一下
clickhouse
整个的debug build
过程
git clone --recursive https://gitee.com/mirrors/clickhouse.git
这个已经是下载好的第三包的中国镜像(每天一同步)- 可能会出现这个问题;需要手动改一下
objcopy
路径
brew install binutils
mdfind -name objcopy
// /usr/local/Cellar/binutils/2.35/bin/objcopy
// 然后改变路径即可
- find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-12" "llvm-objcopy-11" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy")
+ find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-12" "llvm-objcopy-11" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy" PATHS "/usr/local/Cellar/binutils/2.36.1/bin/")
git submodule update --init --recursive
即可(这一步如果在第一步下载好的情况下,其实可以不进行的)- 按照下面依次进行,采用的是
Debug
模式:
mkdir build
cd build
cmake -DCMAKE_C_COMPILER=$(brew --prefix llvm)/bin/clang -DCMAKE_CXX_COMPILER=$(brew --prefix llvm)/bin/clang++ -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
cd ..
因为是学习整个
clickhouse
运行过程,采用的是Debug
模式。如果是线上使用,不要使这个模式,采取RelWithDebInfo
。
剩下的就是等待就行了,编译过程长达 1h。
calltree & cpptree
calltree
-> 观测cpp
代码的调用栈cpptree
-> 观测cpp class
的类对象属性,主要是找继承关系
这个是学习大型 cpp
项目最有力的工具,可以说没有之一。当然还有需要你去 gdb
debug。
用例
cpptree.pl "IStorage" "Merge" 0 3
// 观察 `IStorage` 这个顶层接口中 `MergeTree` 的继承关系
// 很快也能发现:MergeTree -> MergeTreeData,插入的数据也是在 MergeTreeData 中准备的
calltree.pl "processInsertQuery" "" 1 1 3
// processInsertQuery 是要从 TCP 控制insert的入口
// 我们发现上面调用他的是 `KeeperTCPHandler::run`
// KeeperTCPHandler 这个就是 Server::main 中被调用的
// 那么从 main -> insert 的路径就通了
此外还有很多使用方式。可以参考下面的资料。。。