暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

手把手教你使用VSCode编译和调试MySQL 8.0

GrowthDBA 2021-12-08
3555

一直有想学习MySQL源码的心,但止于相关基础资料太少、C语言基础薄弱等因素。

正好前段时间,姜承尧老师的公众号文章:《用VSCode编译和调试MySQL,每个DBA都应get的小技能》一文(地址:https://mp.weixin.qq.com/s/RO_Ipa9_SH8_DuVholrgvg)成功的吸引了我的注意。于是乎,在我们自己技术小交流群的大佬 @一米阳光 成功实践后,我也跃跃欲试,经过两天不懈努力和踩了无数坑后,终是将MySQL 8.0编译&调试环境搞定。

看了姜承尧老师的文章,感觉搭建起来很简单,但是自己实践后,才深刻体会到:纸上得来终觉浅,绝知此事要躬行!下面就来分享一下我的踩坑("避坑")历程。

环境&软件版本介绍




测试环境是基于VMware ESXi管理的VMware虚拟机,管理页面长这个样子。

由于虚拟机采用最小化安装,测试环境操作系统很多软件都没有预装。配置步骤会根据我的测试环境进行,同时我会把重要软件版本信息列出来供大家参考。

服务器配置及重要软件版本


名称‍‍‍详情‍‍‍
远程Linux服务器配置【VMware】16C/32G/500G
操作系统版本CentOS Linux release 7.5.1804 (Core)
Linux内核版本3.10.0-862.el7.x86_64
GCC版本9.3.1
CMake版本cmake3 version 3.17.5
Git版本2.33.1
本地PC操作系统版本macOS Monterey 12.0.1
VSCode版本1.62.3 (latest)



远程Linux服务器配置部署



最终我们要实现的效果就是使用VSCode(Visual Studio Code)这款非常优秀的IDE来编译、调试远程(相较于本地而言连接我们的虚拟机)Linux操作系统上的MySQL 8.0源码。

Linux终端命令行&中文显示设置

设置终端命令行中文显示:

vim /etc/locale.confLANG=zh_CN.UTF8

设置完/etc/locale.conf文件后,需要重启服务器(reboot)生效,echo $LANG查看当前的语言环境已经变为中文。

设置自定义的终端命令行提示符:

vim /etc/profile.d/login.sh#!/bin/bashlocal_ip=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`ID=`id -u`PS1='[\[\e[01;31m\]$local_ip:\u\[\e[m\]\[\e[1;33m\]@\[\e[m\]\[\e[1;35m\]\h\[\e[m\]:$PWD]\$ 'export PS1echo -e "\e[01;34m**********************************************************************************************\e[00m"echo -e "\e[01;31m*\e[00m"echo -e "\e[01;33m* ** 请注意你当前登录的用户和IP地址 **\e[00m"echo -e "\e[01;31m*\e[00m"echo -e "\e[01;33m* ** 你目前登录的账户是: \e[01;31m$LOGNAME\e[00m ** \e[00m"echo -e "\e[01;31m* \e[00m"echo -e "\e[01;33m* ** 语言环境是: \e[01;31m$LANG\e[00m ** \e[00m"echo -e "\e[01;31m* \e[00m"echo -e "\e[01;33m* ** 本机的IP地址: \e[01;31m$local_ip\e[00m ** \e[00m"echo -e "\e[01;31m* \e[00m"echo -e "\e[01;33m* ** 当前路径是: \e[01;31m$PWD\e[00m \e[00m"echo -e "\e[01;31m* \e[00m"if [[ $ID -eq 0 ]];thenecho -e "\e[01;33m* ** 当前系统时间:\e[m \e[01;31m`date +%F_%T`\e[m \e[01;33m当前硬件时间:\e[m \e[01;31m`hwclock --show`\e[m"elseecho -e "\e[01;33m* ** 当前系统时间:\e[m \e[01;31m`date +%F_%T`\e[m \e[01;33m"fiecho -e "\e[01;31m* \e[00m"echo -e "\e[01;33m* ** 备用说明: MySQL 8.0编译调试环境!~ ** \e[00m"echo -e "\e[01;31m* \e[00m"echo -e "\e[01;34m**********************************************************************************************\e[00m"HISTSIZE=999999HISTTIMEFORMAT="%Y/%m/%d_%H:%M:%S `whoami` :"HISTFILESIZE=500000000

加载一下:

source /etc/profile.d/login.sh

最后的效果如下图,喜欢的童鞋可以自行尝试。

必要设置和依赖包的安装

允许本地VSCode通过Remote SSH插件远程登录Linux服务器(必要设置,否则无法通过Remote SSH远程登录):
# 编辑/etc/ssh/sshd_config文件,设置AllowTcpForwarding参数值为yesvim /etc/ssh/sshd_configAllowTcpForwarding yes# 重启sshd使之生效systemctl restart sshd

安装常用软件和依赖包(踩了N多坑后得出的结论,重要!)

yum -y install net-tools wget vim jemalloc-devel jemalloc libudev-devel ncurses-devel openldap openldap-devel cyrus-sasl-plain cyrus-sasl-devel cyrus-sasl-gssapi bison

安装Git

# 安装Git所需要的依赖包yum install curl-devel expat-devel gettext-devel openssl-devel zlib-level gcc-c++ perl-ExtUtils-MakeMaker -y# 下载指定版本的Git源码包cd /usr/local/src/wget --no-check-certificate https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.33.1.tar.gztar -zvxf git-2.33.1.tar.gz# 编译安装cd git-2.33.1./configure --prefix=/usr/local/gitmake && make install# 删除已有的Git版本yum remove git# 添加Git到环境变量(文件末尾添加)vim /etc/profileGIT_HOME=/usr/local/gitexport PATH=$PATH:$GIT_HOME/bin# 刷新环境变量source /etc/profile# 查看Git版本确认安装成功git --version

安装GCC

# 安装第三方软件选集SCLyum install centos-release-scl# 安装GCC 9.+版本yum install devtoolset-9-gcc*# 切换至GCC 9的版本scl --listsource /opt/rh/devtoolset-9/enable# 查看GCC版本gcc -vscl enable devtoolset-9 bash# 查看GCC安装目录which gcc# 设置环境变量(将上述临时切换GCC版本的命令追加到~/.bash_profile文件)vim ~/.bash_profile# .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then        . ~/.bashrcfi# User specific environment and startup programsPATH=$PATH:$HOME/bin:/usr/local/git/binscl enable devtoolset-9 bashsource /opt/rh/devtoolset-9/enableexport PATH# 使环境变量生效source ~/.bash_profile# 查看当前环境GCC版本,确保版本正确gcc --versionenv

安装CMake

# 安装CMake3cd /etc/pki/rpm-gpgwget https://archive.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7yum install cmake3# 设置软链接ln -s /usr/bin/cmake3 /usr/bin/cmake# 查看CMake版本,确认是否安装成功cmake -version

下载MySQL 8.0源码


# 使用git clone方式下载源码git clone https://github.com/mysql/mysql-server.git

至此,远程Linux服务器部署配置完成。
小提示

1、MySQL 8.0版本编译需要CMake3以上版本;

2、Linux系统自带的GCC版本是4.8.5,务必需要GCC 9.+版本并最好设置为默认版本;

3、在编译调试过程中,VSCode的OUTPUT会报各种各样软件版本错误,上文'安装常用软件和依赖包'是将这些错误全部摸排后的最少、且均需要的所有软件包,直接通过yum install命令安装即可。




本地VSCode IDE配置



VSCode(Visual Studio Code)是微软(Microsoft)在2015年4月30日Build开发者大会上正式宣布一个运行于Mac OS X、Windows和Linux之上的,针对于编写现代Web和云应用的跨平台源代码编辑器,可在桌面上运行,并且可用于Windows,macOS和Linux。

我们编译调试MySQL 8.0源码就使用该IDE工具,首先我们需要安装以下插件:

Remote - SSH (v0.66.1)C/C++ (v1.7.1)CMake (v0.0.17)CMake Tools (v1.9.2)Code Spell Checker (v2.0.13)Doxygen Documentation Generator (v1.3.2)

VSCode软件的安装也非常简单,这里就不一一赘述了。插件的安装也非常简单,在插件页签下,搜索对应的插件,直接Install即可,非常方便。比如,我想安装一个'Docker Explorer'插件(如图4步即可搞定)。




编译和调试MySQL 8.0




准备工作都已完成,下面正式进行编译和调试环节,开始吧。

通过Remote SSH连接远程Linux服务器


连接远程Linux服务器:快捷键Ctrl + Shift + p(Windows)、Shift + Command + p(Mac)。

选择'Remote-SSH: Add New SSH Host...'。

按照给出的格式填写我们自己远程Linux服务器的连接信息。我的连接地址就是'ssh root@192.168.11.36 -A'。第一次连接后,这个信息就会保存下来,下次我们直接可以通过下面的方式进行直接连接。

选中我们要连接的远程服务器。

键入密码后,敲一下Enter回车键,就开始连接了...

至此,连接远程Linux服务器成功。确认远程服务器上插件是否安装(如下图我们已经安装)。

如果没有安装,我们需要安装一下,如下图4步,可以快速进行安装(查找并选择我们要安装的插件,点击OK即可完成安装)。

编译MySQL 8.0

选择源码目录并打开(如下图所示4步)。

打开后,界面就是下面这个样子的,如图,我打开了mysql-server/sql/mysqld.cc文件。

准备编译,我们需要选择编译器GCC(我们准备环节安装的9.3.1)版本。

选择程序编译的版本,为了调试方便,选择Debug版本。

选择要编译的程序,如图选择的是[all]:意为要编译MySQL工程下的所有程序。

如下图我们要运行和调试的程序是[mysqld],表示运行MySQL Server程序。

在编译前,我们需要设置CMake参数,因为默认MySQL工程文件不包含boost源码,需要按照以下方法配置(最好将下图第5步Remote [SSH: 192.168.11.36]、Workspace页签全部都配置,防止出现问题)。
Code → Preferences → Settings → 'cmake:Configure' → 【Cmake:Configure Args】-DWITH_BOOST=./boost-DDOWNLOAD_BOOST=1-DWITH_JEMALLOC=1

也可以直接修改settings.json配置文件,可以参照下面的方法配置程序运行参数:
Code → Preferences → Settings → 'cmake:Cache’ →【Cmake:Cache Init】"cmake.debugConfig": {"args:": ["--user=root --log-error=error.log"],}

编译前准备工作就绪。点击最下面【⚙ Build】就可以开始编译了...

编译完成,如下图。

调试MySQL 8.0

设置断点(鼠标左键在行号前单击一下即可),按最下面的小虫子图标就可以调试程序了。

进入调试阶段。

可以通过点击按钮模拟程序运行的顺序,执行过程,变量信息的变化、取值都可以从VSCode获取到。




小结




编译和调试MySQL源码的环境有了,可这才是万里长征的第一步,百万行代码量的MySQL汇聚了多少开发人员的心血,为你们点赞。作为使用者的我,未来要走的路还很长,路漫漫其修远兮,吾将上下而求索。每天进步一点点。



end


文章转载自 GrowthDBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论