暂无图片
暂无图片
暂无图片
暂无图片
2
暂无图片

使用vscode编译、调试miniob源码

原创 夏克 2022-09-09
2968

使用vscode编译、调试miniob源码

引子

最近想继续撸撸OceanBase的代码,发现OB有个项目叫miniob——一个教学级的关系型数据库。从代码量和难易程度上看比较适合我现阶段的精力和水平,开撸前先把环境搞一下。

  • 代码规模(和OceanBase的300w行核心代码不在一个数量级)

image.png

  • miniob官方介绍

miniob 是 OceanBase与华中科技大学联合开发的、面向"零"基础数据库内核知识同学的一门数据库实现入门教程实践工具。 miniob设计的目标是让不熟悉数据库设计和实现的同学能够快速的了解与深入学习数据库内核,期望通过相关训练之后,能够对各个数据库内核模块的功能与它们之间的关联有所了解,并能够在 使用数据库时,设计出高效的SQL。面向的对象主要是在校学生,并且诸多模块做了简化,比如不考虑并发操作。 注意:此代码仅供学习使用,不考虑任何安全特性。

环境准备

运行环境

  • 操作系统
frank@DESKTOP-6NF3B9K:~/git/miniob$ cat /etc/os-release NAME="Ubuntu" VERSION="20.04.5 LTS (Focal Fossa)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 20.04.5 LTS" VERSION_ID="20.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=focal UBUNTU_CODENAME=focal
复制

注:我这里直接用的windows的WSL,

软件要求

  1. vscode

  2. cmake

  3. make

  4. gcc/g++

  5. libevent

  6. googletest

  7. jsoncpp

  8. git

获取代码

git clone https://github.com/oceanbase/miniob.git
复制

安装软件

可以参考miniob/docs/how_to_build.md,但实际上一些依赖可以不用clone在deps目录下,直接安装即可,除非想调试依赖库的代码。

vscode配置

使用vscode打开miniob工程目录。

cd miniob code .
复制

安装插件

image.png

配置编译tasks.json

在工程的.vscode目录下新建tasks.json

{ "options": { "cwd": "${workspaceFolder}/build" }, "tasks": [ { "label": "cmake", "command": "cmake", "args": [ "-DDEBUG=ON", ".." ] }, { "label": "make", "command": "make" }, { "label": "CMake Build", "dependsOn": [ "cmake", "make" ] } ], "version": "2.0.0" }
复制

注意:

  • options:cmake临时文件的目录
  • args:cmake需要的参数

配置调试launch.json

在工程的.vscode目录下新建launch.json

{ // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "(gdb) 启动", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/build/bin/observer", "args": ["-f", "../../etc/observer.ini"], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true }, { "description": "将反汇编风格设置为 Intel", "text": "-gdb-set disassembly-flavor intel", "ignoreFailures": true } ], "preLaunchTask": "CMake Build" } ] }
复制

注意:

  • program:编译出来的可执行文件
  • args:运行参数
  • preLaunchTask:"label": "CMake Build" 对应

演示

  • 重新使用vscode打开,打开后会自动运行tasks的cmake。

image.png

  • 设置断点、启动调试

image.png

注意:启动是会触发make,对工程进行编译。因为是单线程编译,所以第一次惦记启动gdb时需要时间较长,后续如果没有修改源码的操作,则直接踢动gdb进行调试。如果想使用多线程编译可以在tasks.json中配置make参数。

{ "label": "make", "command": "make", "args": [ "-j", "4" ] },
复制

args中配置相当于make -j 4

终端输出如下:

image.png

  • 调试

image.png

注意:同种标记部分包括调试常用的功能,如:查看变量、调用栈、断点,以及n, s, finish, r等命令。

总结

实际上编译和调试是两个过程,我更习惯只配置调试launch.json,而tasks.json的工作可以直接手动完成,也就是可以参考how_to_build.md 的步骤完成编译,然后直接设置可持续文件的路径进行调试。

同样的道理,这种调试方法可以用到其他项目的源码调试中,比如之前调试PostgreSQL和openGauss都可以用这个方法。

最后修改时间:2022-09-09 11:11:15
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

#
暂无图片
1年前
评论
暂无图片 0
同样的方法,不能实现单步调试
1年前
暂无图片 点赞
评论
angel
暂无图片
2年前
评论
暂无图片 0
非常想知道夏老师的这篇文章的定向读者群体是什么样的?能不能请夏老师做一次讲座?
2年前
暂无图片 点赞
评论