当前位置: 首页 > 科技观察

MySQL调试环境搭建:VSCode+Docker

时间:2023-03-16 16:40:00 科技观察

最近大量使用gdb调试,发现了很多有用的功能,但是在Mac上使用gdb调试,体验并不流畅。为此,基于Docker搭建了CentOS环境,并使用VSCode和gdb调试了MySQL,分享给大家。本文基于Mac+MySQL8.0.32。在其他系统搭建MySQL调试环境,也可以参考安装DockerDesktop后的步骤。1、下载DockerDesktop下载地址:https://www.docker.com/products/docker-desktop下载界面:DockerDesktop下载完成后,安装并运行,即可继续下一步操作。2、创建Docker容器,首先在DockerDesktop中设置可以映射到容器的宿主机目录:在第三个红框的输入框中输入/opt/data/docker,然后回车目录加入FILESHARING,即允许宿主机中的目录及其子目录映射到容器中。最后点击第四个红框处的Apply&Restart,应用并重启DockerDesktop,使修改生效。在宿主机上执行以下命令创建容器并运行:#获取CentOS7.9镜像dockerpullcentos:centos7.9.2009#创建容器#这个CentOS容器是专门用来调试MySQL的#所以命名为[mysql]#-d,表示守护进程以模式运行容器#-t,表示需要打开终端#--name,容器名称#-p,端口映射,格式[主机端口:容器端口]#-v、目录映射,格式【宿主目录:容器目录】#centos:centos7.9.2009,镜像dockerrun\--namemysql\-p3306-3310:3306-3310\-v/opt/data/docker/centos79_mysql:/opt/data\--privileged-dt\centos:对于Mac主机上的centos7.9.2009,要连接到容器中的MySQL,需要指定端口映射的-p选项,然后再连接到容器中的MySQL通过主机IP+映射的主机端口。3.安装VSCode扩展VSCode扩展由两部分组成:安装在宿主机上的扩展,和安装在容器中的扩展。我们先打开VSCode,安装宿主机Docker扩展:安装Docker扩展后,我们可以在VSCode中看到之前创建的mysql容器:点击AttachVisualStudioCode打开一个新的VSCode窗口,我们取一个Name:mysql容器窗口,稍后会用到。接下来,在mysql容器窗口上安装扩展。安装C/C++扩展:安装CMakeTools扩展:4.准备编译在宿主机执行如下命令进入mysql容器:dockerexec-timysql/bin/bash在mysql容器中执行以下命令下载源码和安装依赖软件:#创建源码存放根目录mkdir-p/opt/data/code#进入源码存放根目录cd/opt/data/code#安装wget,下载源码&解压yuminstallwgetwgethttps://cdn.mysql.com//Downloads/MySQL-8.0/mysql-boost-8.0.32.tar.gztarzxvfmysql-boost-8.0.32.tar.gz#修改源码目录名mvmysql-8.0.328.0.32#用于安装cmake3yumsourceyum-yinstallepel-release#yum源码用于安装高版本的gcc,gcc-c++,makeyum-yinstallcentos-release-scl#安装依赖软件yuminstalldevtoolset-11-gcc\devtoolset-11-gcc-c++\devtoolset-11-make\cmake3\openssl-devel\ncurses-devel\bison#安装gdbyuminstalldevtoolset-11-gdb#让scl环境暂时生效source/opt/rh/devtoolset-11/enable#让scl环境永久生效yuminstallvimvim/etc/profile.d/scl.sh#将以下内容写入scl.sh,然后保存退出source/opt/rh/devtoolset-11/enable5,按以下步骤编译编译:第一步,在mysql容器中打开刚刚下载的mysql源码目录window:Step2,createa.vscodedirectory:Step3,新建CMake配置文件settings.json:settings.json文件内容如下:{"cmake.buildBeforeRun":true,"cmake.buildDirectory":"${workspaceFolder}/output","cmake.configureSettings":{"WITH_DEBUG":"1","CMAKE_INSTALL_PREFIX":"${workspaceFolder}/output","MYSQL_DATADIR":"/opt/data/8.0.32/data","SYSCONFDIR":"/opt/data/8.0.32/etc","MYSQL_TCP_PORT":"3306","MYSQL_UNIX_ADDR":"/opt/data/8.0.32/data/mysql-debug.sock","WITH_BOOST":"${workspaceFolder}/boost","DOWNLOAD_BOOST":"0"},"files.associations":{"*.ipp":"cpp"},"cmake.parallelJobs":8,"cmake.cmakePath":"cmake3"}cmake.parallelJobs用于控制同时编译多少线程,加快编译速度。默认值为0,CMake会根据CPU核数来决定并发线程数如果编译时报如下错误,解决方法有两种:c++:internalcompilererror:Killed(programcc1plus)解决方法一:将cmake.parallelJobs设置得更小。我在编译的时候设置并发数为10会报错,后来改成8编译成功。方案二:调整容器在DockerDesktop中可以使用的资源,如下:如果想编译的更快,可以将cmake.parallelJobs设置为0,然后,在上面的DockerDesktop界面,增加CPU和Memory.第四步,CMake配置,生成Makefile文件:在mysql容器窗口上方的输入框中,输入>CMake:Configuration,然后选择下面列出的CMake配置,开始生成Makefile文件。选择编译器:如果CMake:配置执行过程中出现错误,需要在解决错误后删除CMakeCache.txt,然后重新执行CMake:配置步骤。CMakeCache.txt文件路径为/opt/data/code/8.0.32/output/CMakeCache.txt。第五步:编译服务器端可执行程序mysqld:在输入框中输入“>CMake:Buildtarget”,选择第二个红框中的选项。然后会出现另一个输入框,在里面输入mysqld,回车开始编译mysqld。第六步:编译客户端可执行程序mysql:在输入框中输入“>CMake:Generatetarget”,选择第二个红框中的选项。然后会出现另一个输入框,在里面输入mysql,回车开始编译mysql。6.初始化接下来在mysql容器中执行如下命令:#创建配置文件目录&数据目录mkdir-p/opt/data/8.0.32/{etc,data}#创建用户&组groupaddmysqluseradd-gmysqlmysql#创建配置文件vim/opt/data/8.0.32/etc/my.cnf#将以下内容放入my.cnf[mysqld]user=mysqlinnodb_file_per_table=1server_id=100log_bin=ONlc-messages-dir=/opt/data/code/8.0.32/output/sharelog-error=/opt/data/8.0.32/error.log#初始化数据目录/opt/data/code/8.0.32/output/bin/mysqld--initialize-insecure7.调试经过前面的一系列操作,就可以在mysql容器窗口开始调试了。第一步,新建配置文件launch.json:launch.json文件内容如下:{"version":"0.2.0","configurations":[{"name":"(gdb)startup","type":"cppdbg","request":"launch","program":"/opt/data/code/8.0.32/output/bin/mysqld","args":[],"stopAtEntry":false,"cwd":"${fileDirname}","environment":[],"externalConsole":false,"MIMode":"gdb","setupCommands":[{"description":"启用整洁打印对于gdb","text":"-enable-pretty-printing","ignoreFailures":true},{"description":"SetdisassemblystyletoIntel","text":"-gdb-setdisassembly-flavorintel","ignoreFailures":true}]}]}第二步,开始调试,launch.json文件配置完成后,在运行和调试下拉框可以看到刚才添加的配置,点击(gdb)开始前面的小三角,启动MySQL,然后就可以开始调试了。第三步:在mysql容器的命令行中,通过之前编译好的客户端可执行程序mysql连接MySQL:cd/opt/data/code/8.0.32/output/bin./mysql-h127.0.0.1-uroot第四步,连接MySQL成功后,在MySQL源码中设置断点,首先打开sql/sql_parse.cc文件:然后在mysql_execute_command()函数入口处设置断点:第五步,执行一条SQL:SELECT主机,用户来自mysql.user;程序在断点处暂停后,可以查看一系列运行时信息,查看断点所在函数的局部变量:查看断点处的调用栈:也可以在调试控制台中查看,使用命令行执行更多gdb命令:VSCode+Docker调试,需要在命令前加-exec,上图中pthd->m_query_string命令前加-exec。8.总结本文介绍VSCode+Docker+CentOS7.9搭建MySQL调试环境的完整过程。本文转载自微信公众号“一树一溪”,可通过以下二维码关注。转载本文请联系艺书艺熙公众号。