先决条件

平台: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数据库服务端启动与客户端连接

服务端相关命令

  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常用命令

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 具体变量名 查看当前程序运行阶段该变量的值
Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐