ubuntu上安装leveldb和gdb调试学习leveldb
   
leveldb的代码笔者已经断断续续看了半年,大致原理已经了解,现在想将leveldb安装到虚拟机上通过gdb或者打印日志的方式跟踪学习以便理解的更加透彻。看了网上的安装指南,感觉soeasy,没想到还是有一些坑,现在总结下来:
    
    
    vmvare的链接方式
   
    为了能够在虚拟机上使用wget或者yum安装,必须是虚拟机能够联网(笔者在vmvare上安装ubuntu)。联网时我们采用桥接模式。
    
    
    
    在虚拟机中操作仍然很不方便,笔者一般采用外部xshell去连接自己的虚拟机进行此操作。正在虚拟机中ifconifig看下ip地址(当然极端情况ifconfig不能使用就按照说明进行安装基本工具),之后在xshell中ssh这个ip即可,当显示
   
Could not connect to '10.7.55.122' (port 22): Connection failed
    时,有以下几种情况:
    
    1、防火墙没有关闭
    
    2、连网方式不对参考上面桥接的方式
    
    3、虚拟机22端口没有监听:
   
netstat -antulp | grep ssh
假如没有监听,说明没有安装sshd服务,安装即可。
sudo apt-get install openssh-server
     
   
    
    
    下载leveldb代码
   
sudo apt-get install git
git clone https://github.com/google/leveldb.git
    
    
    编译
   
    新的开源工程都选择了cmake的方式进行编译。
    
    由于虚拟机上没有安装cmake,还需要安装一个cmake
   
- 安装cmake
sudo apt-get install cmake
- 生成makefile(在leveldb的目录下操作)
	cd leveldb
	cmake  CMakeLists.txt
    
    
    此时应当更改CmakeList.txt中版本号:
    
    
    
    版本号改为3.2即可。
   
若出现CMake错误
No CMAKE_CXX_COMPILER could be found.
运行一下命令即可解决:
	sudo apt-get install build-essential
这时执行cmake命令
  	cmake  CMakeLists.txt
可以看到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
之后直接在leveldb文件夹下执行make 即可
	make
- 
     实现leveldb的gdb调试功能
 
 能够实现gdb调试,对照代码来逐行研究是每个程序员的梦想和初学者的捷径。笔者通过更改编译选项实现对leveldb的gdb调试:
    4-1 在文件 CMakeLists.txt添加下面一条语句
    
    add_definitions(“-Wall -g”)
    
    注意:当vi编辑输入i即插入之后,无法真正插入时,需要安装或升级vim
    
    
     apt-get install vim
    
    
    
    
    4-2 重新生成makefile文件
   
  	cmake  CMakeLists.txt
4-3 执行make,这时生成的.a文件都是可gdb调试的
	make
    
    
    调试
   
- 为了调试方便,我们在leveldb文件夹下新建一个test文件夹,并将leveldb文件夹下面出现一个libleveldb.a拷贝至此
- 
     新建文件leveldbTest.cpp如下:
 
 (此处参考
 
 https://blog.csdn.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 = "asurily@gmail.com";
    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
4.gdb调试如下图,可以看到,已经可以深入到leveldb的db_impl.cc文件进行逐行调试。对初学者对照代码了解leveldb怎样初始化和put,get的框架极为便利。
gdb leveldbTest 
     
   
 
