《OceanBase开发者手册》之五 如何debug OceanBase
Abstract
《OceanBase开发者手册》 主要指导开发者如何参与到OceanBase 的研发, 铺平参与OceanBase 开发的准备工作遇到的问题, 当前章节大概这几篇文章, 未来可能会增加部分文章, 目前OceanBase 源码参考OceanBase 开源官网的《开源数据库OceanBase源码解读》 系列 :
- 如何编译OceanBase源码
- 如何设置IDE开发环境
- 如何成为OceanBase Contributor
- 如何修改OceanBase文档
- 如何debug OceanBase
- 如何运行测试
- 如何修bug
本文将介绍如何debug OceanBase, 如何debug OceanBase, 推荐几种方式:
- 使用vscode 远程debug OceanBase
- 使用gdb 本地debug OceanBase
- 在linux 环境下, 使用CLion 本地debug OceanBase
步骤
准备工作
debug OceanBase 有一个重要的步骤, 就是弄到oceanbase 的启动参数, 每台机器有每台机器的硬件配置, 也会导致启动参数是不一样的. 但做法基本类似.
- 用OBD (https://github.com/oceanbase/obdeploy) 安装部署一套环境
1
21. 单机部署并且是联网环境, 请参考文档https://open.oceanbase.com/quickStart
2. 分布式环境或者离线部署, 请参考文档 https://open.oceanbase.com/docs/community/oceanbase-database/V3.1.1/deploy-the-distributed-oceanbase-cluster - 成功部署环境后, 编译debug 版本OceanBase 参考之前文档 《如何编译OceanBase源码》
- 捕获oceanbase 的启动参数 (通过‘ps -ef|grep observer’).
- (可选)在分布式环境下, 用编译好的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 调试
搭建remote 链接环境
1
21.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/ 进行配置remote ssh 连接远程机器
1
2Ctril + p
选择Remote-SSH:Connect to Host打开对应的源码目录
参考之前文章 介绍 《如何编译OceanBase源码》
设置debug 启动参数, 在菜单栏 “Run” –> “Add Configuration”, 如果之前已经设置过, 修改启动参数就是 菜单栏 “Run” –> “Open Configurations”
我的 配置是
1 | { |
备注: 这个里面有arg的参数来自于第一步的准备工作中获取的启动参数, 每台机器有每台机器的配置, 笔者的参数如下, 其中:
1 | 1. ${OB_SRC_DIR} 为源码目录, ${IP} 为observer 的绑定ip |
- 开始debug, 点击菜单 “Run” –> “Start Debugging”.
直接用gdb 本地调试
登录remote 机器, 并进入${OB_SRC_DIR} 源码目录
参考之前文章 介绍 《如何编译OceanBase源码》
修改 用户目录下的.gdbinit, 添加下面一行, 其中${OB_SRC_DIR}需要换成OB 源码根目录
1
add-auto-load-safe-path ${OB_SRC_DIR}/.gdbinit
vi ${OB_SRC_DIR}/.gdbinit
1
2
3
4file 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 | 1. ${OB_SRC_DIR} 为源码目录, ${IP} 为observer 的绑定ip |
- 推荐使用tui
tui是gdb自带的图形界面,比较直观,这里简单说一下切换方法和常用命令1
2
3
4
5
6
71、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的原生快捷键 - 在源码目录下, 敲入gdb 即可启动gdb debug
1 | gdb |
clion 本地调试
clion 看源码非常方便, symbol 跳转非常友好, 而且天然code format 支持clang-format。 不过, 我没有试过clion 远程debug, 只试过本地clion debug, 不过如果想用clion 本地debug oceanbase, 则开发机器得运行linux。
clion 是debug 中最舒服的方式, 但也是最复杂的方式, 要求也非常高
- 参考之前文章 介绍 《如何编译OceanBase源码》
- 配置 clion的cmake
详情步骤参考图片所示, 需要说明的是,
1 | "Build Directory" 需要设置为“build_debug” |
- 等待几分钟生成cmake 生成结束后, 点击菜单“Run” –》 “Edit configurations”, 也可以类似下面图片, 进行选择编译目标observer
点击菜单“Build” –》 “Build observer”, 编译observer
修改启动参数, 点击菜单“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}
打开文件src/observer/main.cpp, 在main 函数下断点
启动debug, 点击菜单”Run” –> “Debug Observer”