《OceanBase开发者手册》之五 如何debug OceanBase

Abstract

《OceanBase开发者手册》 主要指导开发者如何参与到OceanBase 的研发, 铺平参与OceanBase 开发的准备工作遇到的问题, 当前章节大概这几篇文章, 未来可能会增加部分文章, 目前OceanBase 源码参考OceanBase 开源官网的《开源数据库OceanBase源码解读》 系列 :

  1. 如何编译OceanBase源码
  2. 如何设置IDE开发环境
  3. 如何成为OceanBase Contributor
  4. 如何修改OceanBase文档
  5. 如何debug OceanBase
  6. 如何运行测试
  7. 如何修bug

本文将介绍如何debug OceanBase, 如何debug OceanBase, 推荐几种方式:

  1. 使用vscode 远程debug OceanBase
  2. 使用gdb 本地debug OceanBase
  3. 在linux 环境下, 使用CLion 本地debug OceanBase

步骤

准备工作

debug OceanBase 有一个重要的步骤, 就是弄到oceanbase 的启动参数, 每台机器有每台机器的硬件配置, 也会导致启动参数是不一样的. 但做法基本类似.

  1. 用OBD (https://github.com/oceanbase/obdeploy) 安装部署一套环境
    1
    2
    1. 单机部署并且是联网环境, 请参考文档https://open.oceanbase.com/quickStart
    2. 分布式环境或者离线部署, 请参考文档 https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.1/deploy-the-distributed-oceanbase-cluster
  2. 成功部署环境后, 编译debug 版本OceanBase 参考之前文档 《如何编译OceanBase源码》
  3. 捕获oceanbase 的启动参数 (通过‘ps -ef|grep observer’).
  4. (可选)在分布式环境下, 用编译好的binary observer 去替换 用obd 安装部署的observer

我在我的单机测试环境下, 我用OBD安装部署OceanBase后, 我的OceanBase的启动参数是

1
observer -r xxx.xxx.xxx.xxx:2882:2881 -o __min_full_resource_pool_memory=268435456,enable_syslog_recycle=True,enable_syslog_wf=True,max_syslog_file_count=4,memory_limit=69G,system_memory=27G,cpu_count=19,datafile_size=1029G,clog_disk_utilization_threshold=95,clog_disk_usage_limit_percentage=98 -z zone1 -p 2881 -P 2882 -n obcluster -c 1 -d /home/xxxxxxx/observer/store -i em1 -l INFO

vscode 调试

  1. 搭建remote 链接环境

    1
    2
    1.1 建立开发机到测试机的信任登录, 参考 文档 https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.1/optional-set-password-free-ssh-logon
    1.2 搭建vscode 的remote debug 环境 “Remote-SSH: Connect to Host...”, 参考文章 https://blog.csdn.net/zbbzb/article/details/102957076/ 进行配置
  2. remote ssh 连接远程机器

    1
    2
    Ctril + p
    选择Remote-SSH:Connect to Host
  3. 打开对应的源码目录

  4. 参考之前文章 介绍 《如何编译OceanBase源码》

  5. 设置debug 启动参数, 在菜单栏 “Run” –> “Add Configuration”, 如果之前已经设置过, 修改启动参数就是 菜单栏 “Run” –> “Open Configurations”

我的 配置是

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
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [

{
"name": "observer",
"type": "cppdbg",
"request": "launch",
"program": "${OB_SRC_DIR}/build_debug/src/observer/observer",
"args": ["-r", "${IP}:2882:2881", "-o", "__min_full_resource_pool_memory=268435456,enable_syslog_recycle=True,enable_syslog_wf=True,max_syslog_file_count=4,memory_limit=69G,system_memory=27G,cpu_count=19,datafile_size=1029G,clog_disk_utilization_threshold=95,clog_disk_usage_limit_percentage=98", "-z", "zone1", "-p", "2881", "-P", "2882", "-n", "obcluster", "-c", 1, "-d", "/home/XXX/observer/store", "-i", "em1", "-l", "INFO"],
"stopAtEntry": true,
"cwd": "${OB_SRC_DIR}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}

备注: 这个里面有arg的参数来自于第一步的准备工作中获取的启动参数, 每台机器有每台机器的配置, 笔者的参数如下, 其中:

1
2
3
4
5
1. ${OB_SRC_DIR} 为源码目录, ${IP} 为observer 的绑定ip
2. 需要设置“cwd”, 为${OB_SRC_DIR}
3. 建议设置“stopAtEntry” 为true
4. 在args 参数中, 其中 -d 设置的目录 "/home/xxxxx/observer/store", 需要设置为真实的参数
5. 在args 参数中, 其中-i 设置的设备名称 "em1", 为ip 对应的设备名称
  1. 开始debug, 点击菜单 “Run” –> “Start Debugging”.

直接用gdb 本地调试

  1. 登录remote 机器, 并进入${OB_SRC_DIR} 源码目录

  2. 参考之前文章 介绍 《如何编译OceanBase源码》

  3. 修改 用户目录下的.gdbinit, 添加下面一行, 其中${OB_SRC_DIR}需要换成OB 源码根目录

    1
    add-auto-load-safe-path ${OB_SRC_DIR}/.gdbinit
  4. vi ${OB_SRC_DIR}/.gdbinit

    1
    2
    3
    4
    file build_debug/src/observer/observer
    set args "-r", "XXX.XXX.XXX.XXX:2882:2881", "-o", "__min_full_resource_pool_memory=268435456,enable_syslog_recycle=True,enable_syslog_wf=True,max_syslog_file_count=4,memory_limit=69G,system_memory=27G,cpu_count=19,datafile_size=1029G,clog_disk_utilization_threshold=95,clog_disk_usage_limit_percentage=98", "-z", "zone1", "-p", "2881", "-P", "2882", "-n", "obcluster", "-c", 1, "-d", "/home/longda/observer/store", "-i", "em1", "-l", "INFO"
    b main
    r

备注: 这个里面有args的参数来自于第一步的准备工作中获取的启动参数, 每台机器有每台机器的配置, 笔者的参数如下, 其中:

1
2
3
4
5
1. ${OB_SRC_DIR} 为源码目录, ${IP} 为observer 的绑定ip
2. 需要设置“cwd”, 为${OB_SRC_DIR}
3. 当前的工作目录必须是${OB_SRC_DIR}
4. 在args 参数中, 其中 -d 设置的目录 "/home/xxxxx/observer/store", 需要设置为真实的参数
5. 在args 参数中, 其中-i 设置的设备名称 "em1", 为ip 对应的设备名称
  1. 推荐使用tui
    tui是gdb自带的图形界面,比较直观,这里简单说一下切换方法和常用命令
    1
    2
    3
    4
    5
    6
    7
    1、gdb -tui + (可执行程序)  直接进入tui图形界面

    2、gdb进入后,使用命令focus进入tui图形界面,或者使用快捷键:Ctl+x+a (注意按键顺序,记忆:x:focus,a:another)

    3、在tui中使用相同的快捷键Ctl+x+a返回到gdb原生界面

    4、在gdb中↑和↓切换上一个命令和下一个命令,但是在tui中只是控制代码视图。想达到切换命令的目的,使用Ctl+n (记忆:next)和Ctl+p(记忆:previous),这其实就是gdb的原生快捷键
  2. 在源码目录下, 敲入gdb 即可启动gdb debug
1
gdb 

clion 本地调试

clion 看源码非常方便, symbol 跳转非常友好, 而且天然code format 支持clang-format。 不过, 我没有试过clion 远程debug, 只试过本地clion debug, 不过如果想用clion 本地debug oceanbase, 则开发机器得运行linux。
clion 是debug 中最舒服的方式, 但也是最复杂的方式, 要求也非常高

  1. 参考之前文章 介绍 《如何编译OceanBase源码》
  2. 配置 clion的cmake

详情步骤参考图片所示, 需要说明的是,

1
2
"Build Directory" 需要设置为“build_debug”
"CMake options" 需要设置为“${OB_SRC_DIR} -DCMAKE_BUILD_TYPE=Debug”, 其中${OB_SRC_DIR} 需要修改为真实的目录全路径
  1. 等待几分钟生成cmake 生成结束后, 点击菜单“Run” –》 “Edit configurations”, 也可以类似下面图片, 进行选择编译目标observer
  1. 点击菜单“Build” –》 “Build observer”, 编译observer

  2. 修改启动参数, 点击菜单“Run” –》 “Edit configurations”, 出现界面后

在我的机器上”Program Arguements” 为

1
-r ${ip}:2882:2881 -o __min_full_resource_pool_memory=268435456,enable_syslog_recycle=True,enable_syslog_wf=True,    max_syslog_file_count=4,memory_limit=8G,system_memory=4G,cpu_count=16,datafile_size=44G,clog_disk_utilization_threshold=95,clog_disk_usage_limit_percentage=98 -z zone1 -p 2881 -P 2882 -n obcluster -c 1 -d ${data_dir} -i ${devname} -l INFO

${ip} : 为本机ip

${data_dir}: 为数据目录

${devname}: 为ip 所对应的网卡名称, 通常为eth0 或lo

在“Woring Directory”必须为${OB_SRC_DIR}

  1. 打开文件src/observer/main.cpp, 在main 函数下断点

  2. 启动debug, 点击菜单”Run” –> “Debug Observer”