opengauss数据库debug开发版docker安装配置
entrypoint.sh文件在每次我们docker start或者在docker desktop界面手动start容器时都会运行,而图示中的两行执行的是initdb操作,如果不注释掉,就会导致stop容器后,再次strat打开便会失败,因为实际容器内已经存在对应的数据库,initdb操作失败而使得容器start失败。对于调试客户端连接的sql语句执行流程而言,最重要的就是其中最后一个worker
先决条件
平台: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.0 | opengauss服务器源码 |
源码编译构建命令
在开发修改服务器源码后,需要重新对源码重新编译构建。
首先进入服务器源码目录下
[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数据库服务端启动与客户端连接
服务端相关命令
- 启动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

- 关闭opengauss server
gs_ctl stop -D /home/opengauss/openGauss/data - 重启opengauss server
gs_ctl restart -D /home/opengauss/openGauss/data -Z single_node
客户端相关命令
- 连接数据库服务端
[opengauss@acf63d7ebcf5 ~]$ gsql -d postgres

进入到openGauss数据库用户下
- 断开数据库连接
在命令行输入\q即可
![]()
- 获取当前系统所有公共表
openGauss=# SELECT tablename FROM pg_tables WHERE schemaname='public';

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

使用gdb附着gaussdb服务端进行调试
先备条件
- 启动服务端
gs_ctl start -D /home/opengauss/openGauss/data -Z single_node - 客户端连接
gsql -d postgres - 查找服务端进程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常用命令
| command | use method |
|---|---|
| breakpoint(简写为 b) | b 具体文件:具体行数 b 具体函数名 |
| info breakponits(简写为 i b) | 查看全部的断点信息 |
| delete(简写为 d) | d 具体断点号 删除具体断点 d 删除全部断点 |
| watch | watch 变量名 监视某一个变量,如发生变化,则在变化处终端程序 |
| disable(简写为 dis) | disable 具体断点号,暂时禁用断点 |
| enable(简写为 en) | enable 具体断点号,重新启动断点 |




| command | use method |
|---|---|
| next(简写为 n) | 单步执行代码 |
| step(简写为 si) | 步入至当前代码位置的调用函数 |
| list(简写为 l) | 显示当前位置的源代码 |
| finish(简写为 fin) | 执行程序直到从当前函数返回为止,并停在调用该函数的地方 |
| continue(简写为 c) | 继续执行程序,直至程序结束或遇到下一个断点 |
| print(简写为 p) | p 具体变量名 查看当前程序运行阶段该变量的值 |
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)