opengauss数据库debug开发版docker安装配置

先决条件

平台:Windows 11

docker:docker dekstop application

可访问docker hub官网进行下载https://hub.docker.com/

windows下的docker可以选用wsl2作为backend,使用起来十分方便。

启动docker

打开docker desktop后,界面如下

这时候我们便可以开始拉取镜像,安装容器了。

打开windows下的终端powershell,输入命令拉取opengauss-dev版本镜像

 docker pull opengauss/opengauss-dev:5.0.0

这个镜像有些大,全部下载完毕大小7GB左右,注意预留好对应磁盘空间。

下载后镜像后,我们便可以依托镜像启动我们的容器。

powershell下使用命令:

 docker run  --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --security-opt apparmor=unconfined --name gs-dev --privileged -it opengauss/opengauss-dev:5.0.0

这样便会创建一个名为gs-dev的容器,在我们的docker desktop图形化界面也能看到

这个时候容器便已经处于启动状态,接下来便可以连入docker进行相应开发。

这里我们选用vscode来进行连接开发!

VScode连接docker容器

在VScode扩展商店中搜索docker,下载对应官方扩展

下载后,侧边栏便会多出一个名为docker的侧边栏

可以看到我们docker中对应的continer容器以及image镜像都会在这里显示,我们右键单击对应的容器,点击attach VScode的选项,便会新开一个vscode窗口,进入容器环境。

进一步的在vscode容器环境内,点击扩展,下载c++相关插件,让代码看起来更加舒服轻便。

修改容器配置

opengauss-dev容器内有一些小bug,需要我们对配置进行一些修改,以便更好地使用。

打开entrypoint.sh文件,将图示中的两行进行注释。

entrypoint.sh文件在每次我们docker start或者在docker desktop界面手动start容器时都会运行,而图示中的两行执行的是initdb操作,如果不注释掉,就会导致stop容器后,再次strat打开便会失败,因为实际容器内已经存在对应的数据库,initdb操作失败而使得容器start失败。

容器内部目录结构解析

在对应目录下,主要的文件是红框中的opengauss目录与openGauss-server目录

目录内容
openGauss存储初始化的数据库相关内容
openGauss-server-v5.0.0opengauss服务器源码

源码编译构建命令

在开发修改服务器源码后,需要重新对源码重新编译构建。

首先进入服务器源码目录下

 [opengauss@acf63d7ebcf5 ~]$ cd openGauss-server-v5.0.0/

可以看到对应的configure命令,我们可以通过命令进行编译

 [opengauss@acf63d7ebcf5 openGauss-server-v5.0.0]$ ./configure --gcc-version=7.3.0 CC=g++ CFLAGS='-O0 -g' --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-cassert --enable-thread-safety --enable-debug --without-readline --without-zlib

编译完成后,通过make命令进行构建

 [opengauss@acf63d7ebcf5 openGauss-server-v5.0.0]$ make -j 8 && make install -j 8

看到终端显示opengauss installation complete说明构建成功。

opengauss数据库服务端启动与客户端连接

服务端相关命令

  1. 启动oepngauss server
    gs_ctl start -D /home/opengauss/openGauss/data -Z single_node
    gaussdb -D /home/opengauss/openGauss/data --single_node


显示server started说明服务器启动成功。
也可以通过查找gaussdb进程pid号,来判断是否启动成功。
[opengauss@acf63d7ebcf5 openGauss-server-v5.0.0]$ pgrep gaussdb

  1. 关闭opengauss server
    gs_ctl stop -D /home/opengauss/openGauss/data
  2. 重启opengauss server
    gs_ctl restart -D /home/opengauss/openGauss/data -Z single_node

客户端相关命令

  1. 连接数据库服务端
    [opengauss@acf63d7ebcf5 ~]$ gsql -d postgres


进入到openGauss数据库用户下

  1. 断开数据库连接
    在命令行输入\q即可

  1. 获取当前系统所有公共表
    openGauss=# SELECT tablename FROM pg_tables WHERE schemaname='public';

  1. 获取某个表的相关信息
    openGauss=# select column_name, data_type from information_schema.columns where table_name='health_data';

使用gdb附着gaussdb服务端进行调试

先备条件

  1. 启动服务端
    gs_ctl start -D /home/opengauss/openGauss/data -Z single_node
  2. 客户端连接
    gsql -d postgres
  3. 查找服务端进程pid
    pgrep gaussdb

开始调试

使用gdb attach +进程pid的命令进行调试进程附着(attach 也可以简写为 a)

 [opengauss@acf63d7ebcf5 openGauss-server-v5.0.0]$ gdb a 13606

gaussdb服务端进程被附着后会生起各种线程来处理数据库中的不同操作。

在gdb中可以通过 info threads命令来获取全部线程信息(info 也可以简写为 i)

 (gdb) i threads

对于调试客户端连接的sql语句执行流程而言,最重要的就是其中最后一个worker线程,它是用来处理接收客户端连接信息的。

我们可以通过thread +线程id,也就是线程信息中第一列,来跳转到对应线程上来查看其信息。查看调用堆栈信息,可以使用backtrace命令(简写 bt)

 (gdb) thread 37
 (gdb) bt

可以看到37号worker线程正处于recv等待客户端信息阶段。

opengauss具体打断点调试前的必备操作!

由于opengauss内置了特别的SIGUSR1与SIGUSR2的自定义signal。

为了更好的调试体验,我们需要在具体打断点调试前,先使用handle命令禁用掉这两个信号。

 (gdb) handle SIGUSR1 noprint nostop pass
 (gdb) handle SIGUSR2 noprint nostop pass

gdb常用命令

commanduse method
breakpoint(简写为 b)b 具体文件:具体行数
b 具体函数名
info breakponits(简写为 i b)查看全部的断点信息
delete(简写为 d)d 具体断点号 删除具体断点
d 删除全部断点
watchwatch 变量名 监视某一个变量,如发生变化,则在变化处终端程序
disable(简写为 dis)disable 具体断点号,暂时禁用断点
enable(简写为 en)enable 具体断点号,重新启动断点

commanduse method
next(简写为 n)单步执行代码
step(简写为 si)步入至当前代码位置的调用函数
list(简写为 l)显示当前位置的源代码
finish(简写为 fin)执行程序直到从当前函数返回为止,并停在调用该函数的地方
continue(简写为 c)继续执行程序,直至程序结束或遇到下一个断点
print(简写为 p)p 具体变量名 查看当前程序运行阶段该变量的值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值