$ git clone --recursive [email protected]:ClickHouse/ClickHouse.git
# ...alternatively, you can use https://github.com/ClickHouse/ClickHouse.git as the repo URL.
# 如果fork了仓库,请将url替换为自己的仓库地址
# 若是中断可以使用以下命令
$ git fetch --recurse-submodules
$ git submodule update --init --recursive
这里以mac m1版本为例,前提是安装好homebrew和xcode,然后执行下面命令
$ brew update
$ brew install ccache cmake ninja llvm binutils
由于m1版本的homebrew安装软件路径与原intel版本不一样,如果我们在终端输入clang --version 如果出现的是xcode的clang地址,我们需要在环境变量里更换为llvm的clang。(linux同理配置)
$ vim ~/.zshrc
# 在下面添加以下配置,linux同理配置
export PATH=$(brew --prefix llvm)/bin:$PATH
export CC=$(brew --prefix llvm)/bin/clang
export CXX=$(brew --prefix llvm)/bin/clang++
# 执行使环境生效
$ source ~/.zshrc
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "lldb-ck-cmake",
// 参数说明: CMAKE_BUILD_TYPE=Debug开启调试模式,没有这个参数则生成的二进制文件无法调试。
// CMAKE_EXPORT_COMPILE_COMMANDS=YES,clangd插件用来在当前文件夹下生成索引跳转文件compile_commands.json的,如果增加或者减少代码行数这个参数必须加上,否则调试时断点会错位
// -DENABLE_CCACHE=0 如果报相应错了就加上这个,也可以安装compiler cache 然后设置为1,-DENABLE_CCACHE=1,加快后期编译
"command": "cd ${workspaceFolder}/build; cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=YES"//最后参数会生成调试的compile_commands.json文件
},
// 修改文件后重新编译使用ninja即可,不需要重新cmake,可以将上面的task注释掉
{
"type": "shell",
"label": "lldb-ck-ninja",
"dependsOn": "lldb-ck-cmake",//如果上面cmake的task被注释了,该段也注释一下
// -j N 表示并发执行的数量,一般配置自己系统的核心数即可,默认N=3
// 如果要编译全部文件,则去除后面的clickhouse-server
"command": "cd ${workspaceFolder}/build; ninja -j 8 clickhouse-server"
},
// {
// "type": "shell",
// "label": "lldb-ck-gitpull",
// "command": "git pull && git submodule update --init --recursive"
// }
]
}
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "lldb", //调试类型lldb,gdb,cppgdb等等,这里用lldb
"request": "launch", //lldb的调试类型:launch就是正常的启停调试,attach是后台启动服务,然后lldb链接到进程上进行调试。
"name": "lldb-ck-debug", //debug服务的名字,会展示在调试按钮旁
"program": "${workspaceFolder}/build/programs/clickhouse-server", //调试时启动的程序,可以选择build/programs下生成二进制文件
"args": [
"--config-file",
"${workspaceFolder}/programs/server/config.xml"
// 也可以放在一起,看个人习惯
// "--config-file=${workspaceFolder}/programs/server/config.xml"
], //调试时的参数
"cwd": "${workspaceFolder}/build", // 调试程序时的工作目录,一般为${workspaceFolder}即代码所在目录
"preLaunchTask": "lldb-ck-ninja", //调试前对应的task项目label
"console":"internalConsole",
"postRunCommands": [
"pro hand -p false -s false -n false SIGUSR1",
"pro hand -p false -s false -n false SIGUSR2"
], //被打断时避免输入
"initCommands":["settings set target.disable-aslr false"]
}
]
}
{
"lldb.consoleMode": "evaluate", //终端命令模式,可以调用lldb命令
"lldb.launch.sourceLanguages": [
"cpp",
"c"
],
"lldb.launch.expressions": "native", // 原生表达式
"lldb.displayFormat": "auto",
"lldb.dereferencePointers": false,
"lldb.showDisassembly": "auto"
}
当然你也可以点击设置按钮,选择CodeLLDB,然后在页面进行配置,当然效果是一样的
# debugger为lldb时,且命令模式为evaluate
/cmd pro hand -p false -s false -n false SIGUSR1
/cmd pro hand -p false -s false -n false SIGUSR2
# 或者
`pro hand -p false -s false -n false SIGUSR1
`pro hand -p false -s false -n false SIGUSR2
增加ccache缓存的大小可以增加命中率。可以使用以下命令来设置最大缓存大小:
export CCACHE_MAXSIZE=10G或者用这个ccache -M 25G命令
常见命令:
ccache -s:显示ccache缓存的使用情况
ccache -z:清空ccache缓存
具体说明
cache directory: ccache缓存所在的目录;
cache hit rate:缓存命中率,也就是已经存在于缓存中并已被命中的对象文件所占百分比;
cache miss rate:缓存未命中率,也就是需要重新编译的对象文件所占百分比;
cache hit (direct):实际存在于缓存中并被直接读取的对象文件数量;
cache hit (preprocessed):实际存在于缓存中并被预处理后读取的对象文件数量;
cache miss:没有命中缓存并需要重新编译的对象文件数量;
cache total:已经从编译器得到的对象文件数量;
preprocessor error:预处理失败的次数。