• 使用vscode编译、调试miniob源码


    使用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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    注:我这里直接用的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
    
    • 1

    安装软件

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

    vscode配置

    使用vscode打开miniob工程目录。

    cd miniob
    code .
    
    • 1
    • 2

    安装插件

    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"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    注意:

    • 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"
            }
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    注意:

    • 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"
                ]
            },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    args中配置相当于make -j 4

    终端输出如下:

    image.png

    • 调试

    image.png

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

    总结

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

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

  • 相关阅读:
    Android 发布 15 周年了!Google 员工说出了这些年的美好回忆
    JVM:区域划分和垃圾回收
    5.部署web项目到云服务器
    2年开发经验去面试,吊打面试官,即将面试的程序员这些笔记建议复习
    【STL】list的模拟实现
    将Windows文件复制,改装成游戏
    RK3588实用技巧:查看显示器支持的分辨率,基于weston修改分辨率输出
    node插件express(路由)的插件使用(二)——body-parser和ejs插件的基本使用
    自建私人图床方案:使用Cpolar+树洞外链轻松部署超轻量级图床,实现高效图片存储
    LeetCode算法题解|LeetCode435. 无重叠区间、LeetCode763. 划分字母区间、LeetCode56. 合并区间
  • 原文地址:https://blog.csdn.net/xk_xx/article/details/126848514