LevelDB 之clion 中debug环境

501 阅读1分钟

前言

leveldb 是google的大佬写的一个嵌入式的KV数据库。底层是使用的LSM-Tree 索引结构。本文主要涉及levelDB的数据写入,也就是Put 操作。我是个搞java的,C或者C++是不咋会,所以边看边学,可能比较啰嗦。

Debug环境搭建

首先拉代码:

git clone github.com/google/leve…

因为源码中的third_party 包含了两个,一个是google的test,还有一个是benchmark。需要拉下来,放到third_party的目录,或者直接在目录里pull

git clone github.com/google/benc… git clone github.com/google/goog…

按照文档中,需要

mkdir -p build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .

但是因为我的目的是在clion debug。所以暂时没有做这一步,而是在源码中新增了一个app目录,下面放我的demo代码:

#include <cassert>
#include <iostream>
#include "include/leveldb/db.h"
int main() {
  leveldb::DB *db;
  leveldb::Options options;
  options.create_if_missing = true;
  leveldb::Status status = leveldb::DB::Open(options, "/home/tuitaking/source/leveldb/file", &db);
  assert(status.ok());
  std::cout << "leveldb open success!" << std::endl;
  std::string value;
  std::string key1 = "testkey1";
  leveldb::Status s = db->Get(leveldb::ReadOptions(), key1, &value);
  if (s.IsNotFound()) {
    std::cout << "can not found for key:" << key1 << std::endl;
    db->Put(leveldb::WriteOptions(), key1, "testvalue1");
  }
  s = db->Get(leveldb::ReadOptions(), key1, &value);
  if (s.ok()) {
    std::cout << "found key:" << key1 << ",value:" << value << std::endl;
  }
  s = db->Delete(leveldb::WriteOptions(), key1);
  if (s.ok()) {
    std::cout << "delete key success which key:" << key1 << std::endl;
  }
  s = db->Get(leveldb::ReadOptions(), key1, &value);
  if (s.IsNotFound()) {
    std::cout << "can not found after delete for key:" << key1 << std::endl;
  }
  delete db;
  return 0;
}

然后在CMakeLists.txt 中新增上这个模块

add_library(leveldb "" )
target_sources(leveldb
  PRIVATE
    "${PROJECT_BINARY_DIR}/${LEVELDB_PORT_CONFIG_DIR}/port_config.h"
    "app/main.cpp"     # 加这个位置
    "db/builder.cc"

然后将test 也加入

  leveldb_test("db/c_test.c")
  leveldb_test("app/main.cpp") # 加的这行

然后就可以在clion中看到一个叫main的test,直接可以debug。至于为什么估计需要看cmake 相关的知识,暂时不去管他,总之这样就可以直接debug了。如果是windows,cmake的环境只要做好了,其他的都是类似。在clion中可以直接debug。