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/westbrookliu/article/details/85838606
https://download.****.net/download/smilecnf/10942052
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
时,有以下几种情况:
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
1
生成makefile(在leveldb的目录下操作)
cd leveldb
cmake CMakeLists.txt
此时应当更改CmakeList.txt中版本号:
版本号改为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
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