LevelDB 调试环境搭建

LevelDB 是知名的 C++/数据库/K-V 存储/LSM Tree 相关的项目,由 Google 的 Jeffrey Dean 等知名大牛编写。阅读源码是学习提升的必经之路,这条道路上的第一个障碍就是如何把代码跑起来,并自己上手运行、调试。本文以 LevelDB 为例,介绍如何搭建 LevelDB 的调试环境,为后续阅读源码做好铺垫工作。

本文的环境为 Linux + VS Code,LevelDB 官方仓库为:google/leveldb: LevelDB is a fast key-value storage library written at Google that provides an ordered mapping from string keys to string values. (github.com)

1. 必要插件安装

使用 VS Code 阅读代码时,选择合适的插件能提升效率。之前在网上看到很多推荐 clangd + CodeLLDB 家族的插件,而本人之前也一直使用微软的 IntelliSense 等官方 C/C++ 开发环境插件。因此,借这次机会尝试下新事物。

插件的安装流程本文就详细介绍了,网上能够搜索很多相关的文章,这里贴几个供参考:

可以选择一个博客,按照步骤安装插件。要注意的是 clangd 和微软的插件只可以安装一个,防止冲突。

2. 克隆仓库

安装完插件后,我们来拉取代码。当然可以使用谷歌官方的代码仓库:LevelDB ,不过笔者也克隆了一个仓库,并提供了可进行 Debug 的入口文件,并更改了 CmakeLists.txt 文件,想省点事可以克隆如下仓库:UnpureRationalist/leveldb: LevelDB is a fast key-value storage library written at Google that provides an ordered mapping from string keys to string values. (github.com)

具体的命令直接参考代码仓库的 README 就行了,注意使用 git clone 的时候要加上 --recurse-submodules 选项。

3. 编译调试

下载完成代码后进入项目根目录,执行下面的命令进行编译:

1
2
mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Debug .. && cmake --build .

编译完成后,使用 ls 命令查看输出,具体如下:


这里使用的是本人克隆并稍作修改的仓库,多了一个可执行文件:test_entry,用于进行调试。这一可执行文件对应的源代码位于 benchmarks 目录下,文件名为 test.cc,具体代码(摘自 LevelDB 官方文档中)如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <cassert>
#include <iostream>
#include <iterator>

#include "leveldb/db.h"
#include "leveldb/options.h"
#include "leveldb/slice.h"

int main() {
leveldb::DB* db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());

leveldb::WriteOptions write_options;
leveldb::ReadOptions read_options;
leveldb::Slice key{"1"};
leveldb::Slice value{"666"};
db->Put(write_options, key, value);
std::string result;
db->Get(read_options, key, &result);

std::cout << "key: " << key.data() << ", value: " << result << std::endl;

// iterator
leveldb::Iterator* it = db->NewIterator(read_options);
for (it->SeekToFirst(); it->Valid(); it->Next()) {
std::cout << it->key().ToString() << ": " << it->value().ToString()
<< std::endl;
}
assert(it->status().ok()); // Check for any errors found during the scan
delete it;

return 0;
}

我们在 VS Code 页面按 Ctrl + Shift + D 按键,左边出现以下界面:


点击图中红色框内的 create a launch.json file,创建文件,复制粘贴内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug",
"program": "${workspaceFolder}/build/test_entry",
"args": [],
"cwd": "${workspaceFolder}"
}
]
}

其实主要就是改动 "program": "${workspaceFolder}/build/test_entry" 这个配置,以找到 Debug 入口文件。

然后在 test.cc 文件中随便添加一个断点,点击 F5 按键,开始愉快的 Debug:


至此,就可以在图形化界面中进行 Debug,追踪代码执行流程,阅读源码。

当然,喜欢 gdb 命令行的话就不需要这一通操作了,直接命令行 gdb 启动进行 Debug 即可。

4. 总结

以上就是在 VS Code 中搭建 LevelDB 调试环境的大致流程,如果中途遇到问题,针对性地进行搜索解决即可。成功运行代码,开启调试后,就可以开始阅读源码了,后续见。


LevelDB 调试环境搭建
https://arcsin2.cloud/2024/05/25/LevelDB-调试环境搭建/
作者
arcsin2
发布于
2024年5月25日
许可协议