ubuntu上安装leveldb和gdb调试学习leveldb

https://blog.****.net/zc08291161/article/details/85548269

2:  leveldb

https://blog.****.net/xuxuan_csd/article/category/6964406

Leveldb源码解析第一篇【Data Block】

https://blog.****.net/xuxuan_csd/article/details/72965459

......

....

3: Leveldb源码分析

http://www.360doc.com/content/18/0722/21/49389592_772448004.shtml

https://blog.****.net/west*liu/article/details/85838606

https://download.****.net/download/smilecnf/10942052

leveldb源码分析

 

 

leveldb的代码笔者已经断断续续看了半年,大致原理已经了解,现在想将leveldb安装到虚拟机上通过gdb或者打印日志的方式跟踪学习以便理解的更加透彻。看了网上的安装指南,感觉soeasy,没想到还是有一些坑,现在总结下来:

vmvare的链接方式
为了能够在虚拟机上使用wget或者yum安装,必须是虚拟机能够联网(笔者在vmvare上安装ubuntu)。

联网时我们采用桥接模式。

ubuntu上安装leveldb和gdb调试学习leveldb

在虚拟机中操作仍然很不方便,笔者一般采用外部xshell去连接自己的虚拟机进行此操作。正在虚拟机中ifconifig看下ip地址(当然极端情况ifconfig不能使用就按照说明进行安装基本工具),之后在xshell中ssh这个ip即可,当显示

Could not connect to '10.7.55.122' (port 22): Connection failed
1
时,有以下几种情况:
1、防火墙没有关闭
2、连网方式不对参考上面桥接的方式
3、虚拟机22端口没有监听:

netstat -antulp | grep ssh


假如没有监听,说明没有安装sshd服务,安装即可。

sudo apt-get install openssh-server

ubuntu上安装leveldb和gdb调试学习leveldb

下载leveldb代码
sudo apt-get install git
git clone https://github.com/google/leveldb.git

编译
新的开源工程都选择了cmake的方式进行编译。
由于虚拟机上没有安装cmake,还需要安装一个cmake

安装cmake
sudo apt-get install cmake
1
生成makefile(在leveldb的目录下操作)
    cd leveldb
    cmake  CMakeLists.txt

ubuntu上安装leveldb和gdb调试学习leveldb

此时应当更改CmakeList.txt中版本号:

ubuntu上安装leveldb和gdb调试学习leveldb

版本号改为3.2即可。

若出现CMake错误

No CMAKE_CXX_COMPILER could be found.
1
运行一下命令即可解决:

    sudo apt-get install build-essential
1
这时执行cmake命令

      cmake  CMakeLists.txt
1
可以看到leveldb文件夹下出现了makefile文件

解决make不可用问题
make时出现提示:
    The program 'make' can be found in the following packages:
    * make
    * make-guile
    Try: apt install <selected package>

运行一下命令即可解决:

    sudo apt-get install build-essential
1
之后直接在leveldb文件夹下执行make 即可

    make
1
实现leveldb的gdb调试功能
能够实现gdb调试,对照代码来逐行研究是每个程序员的梦想和初学者的捷径。笔者通过更改编译选项实现对leveldb的gdb调试:
4-1 在文件 CMakeLists.txt添加下面一条语句
add_definitions("-Wall -g")
注意:当vi编辑输入i即插入之后,无法真正插入时,需要安装或升级vim
apt-get install vim

ubuntu上安装leveldb和gdb调试学习leveldb

4-2 重新生成makefile文件

      cmake  CMakeLists.txt
1
4-3 执行make,这时生成的.a文件都是可gdb调试的

    make
1. 调试为了调试方便,我们在leveldb文件夹下新建一个test文件夹,并将leveldb文件夹下面出现一个libleveldb.a拷贝至此
2. 新建文件leveldbTest.cpp如下:
(此处参考https://blog.****.net/yooliee/article/details/76467706)
#include <assert.h>
#include <iostream>
#include "leveldb/db.h"

using namespace std;

int main(){
    leveldb::DB* db;
    leveldb::Options options;
    options.create_if_missing = true;
    leveldb::Status status = leveldb::DB::Open(options,"./testdb",&db);//打开一个数据库
    std::string key = "asurily";
    std::string value = "[email protected]";

    status = db->Put(leveldb::WriteOptions(), key, value);//添加
    assert(status.ok());

    status = db->Get(leveldb::ReadOptions(), key, &value);//获取
    assert(status.ok());
    std::cout<<value<<std::endl;

    std::string key2 = "yooliee";
    status = db->Put(leveldb::WriteOptions(), key, key2);//修改(就是重新赋值)
    assert(status.ok());
    status = db->Get(leveldb::ReadOptions(), key, &value);
    cout<<key<<"=="<<value<<endl;
    status = db->Delete(leveldb::WriteOptions(),key);//删除
    assert(status.ok());
    status = db->Get(leveldb::ReadOptions(), key2, &value);
    assert(status.ok());
    cout<<key2<<"=="<<value<<endl;

    status = db->Get(leveldb::ReadOptions(), key, &value);
    if(!status.ok()){
        std::cerr << key << ": "<<status.ToString()<<std::endl;
    }else{
        std::cout << key <<"=="<<value<<std::endl;
    }
    delete db; //关闭数据库

    return 0;  
}


3.生成可调试的二进制文件(和别的帖子不同之处就是加了-g)

g++ -g -o leveldbTest leveldbTest.cpp libleveldb.a -lpthread
1
4.gdb调试如下图,可以看到,已经可以深入到leveldb的db_impl.cc文件进行逐行调试。对初学者对照代码了解leveldb怎样初始化和put,get的框架极为便利。

gdb leveldbTest 

ubuntu上安装leveldb和gdb调试学习leveldb