《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
  1. 成功部署环境后, 编译debug 版本OceanBase 参考之前文档 《如何编译OceanBase源码》
  2. 捕获oceanbase 的启动参数 (通过‘ps -ef|grep observer’).
  3. (可选)在分布式环境下, 用编译好的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/ 进行配置
  1. remote ssh 连接远程机器
1
2
Ctril + p
选择Remote-SSH:Connect to Host
  1. 打开对应的源码目录

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

  3. 设置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
  1. 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的原生快捷键
  1. 在源码目录下, 敲入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
《OceanBase开发者手册》之五 如何debug OceanBase

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

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

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

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

在我的机器上”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”