在ubuntu上安装leveldb并gdb调试学习leveldb

  • Post author:
  • Post category:其他




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

  1. 安装cmake
sudo apt-get install cmake
  1. 生成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文件

  1. 解决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
  1. 实现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



调试

  1. 为了调试方便,我们在leveldb文件夹下新建一个test文件夹,并将leveldb文件夹下面出现一个libleveldb.a拷贝至此
  2. 新建文件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 

在这里插入图片描述



版权声明:本文为zc08291161原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。