阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

271次阅读
没有评论

共计 4637 个字符,预计需要花费 12 分钟才能阅读完成。

导读 近期使用 gdb 调试比较多,发现了很多好用的功能,而在 Mac 上使用 gdb 调试,体验不太顺畅。为此,基于 Docker 搭建了一套 CentOS 环境,结合 VSCode 和 gdb 来调试 MySQL,拿出来和大家分享。本文介绍了 VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境的完整流程。

本文基于 Mac + MySQL 8.0.32,对于在其它系统上搭建 MySQL 调试环境,安装好 Docker Desktop 之后的步骤也是可以借鉴的。

1、下载 Docker Desktop

下载地址:https://www.docker.com/products/docker-desktop

下载界面:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

Docker Desktop 下载完成之后,安装并运行,然后就可以继续接下来的步骤了。

2、创建 Docker 容器

先在 Docker Desktop 中设置能够映射到容器中的宿主机目录:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

在第 3 个红框处的输入框​中,输入 /opt/data/docker​,然后按回车键​把目录加入 FILE SHARING​,表示允许把宿主机中该目录及其子目录映射到容器中,最后点击第 4 个红框处的 Apply & Restart​,应用并重启 Docker Desktop,让修改生效。

在宿主机执行以下命令,创建容器并运行:

# 获取 CentOS 7.9 镜像
docker pull centos:centos7.9.2009

# 创建容器
# 这个 CentOS 容器专用于调试 MySQL
# 所以命名为【mysql】# -d,表示以守护进程方式运行容器
# -t,表示需要打开终端
# --name,容器名字
# -p,端口映射,格式【宿主机端口: 容器端口】# -v,目录映射,格式【宿主机目录: 容器目录】# centos:centos7.9.2009,镜像
docker run \
  --name mysql \
  -p 3306-3310:3306-3310 \
  -v /opt/data/docker/centos79_mysql:/opt/data \
  --privileged -dt \
  centos:centos7.9.2009

在 Mac 宿主机上,连接容器中的 MySQL,需要指定 -p 选项做端口映射,然后通过 宿主机 IP + 映射的宿主机端口连接容器中的 MySQL。

3、安装 VSCode 扩展

VSCode 扩展包含两部分:安装在宿主机的扩展、安装在容器中的扩展。

我们先打开 VSCode,安装宿主机 Docker 扩展:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

安装 Docker 扩展之后,我们就能在 VSCode​ 中看到之前创建的 mysql 容器了:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

点击 Attach Visual Studio Code 会打开一个新的 VSCode 窗口,我们给它取个名字:mysql 容器窗口,后面会用到。

接下来,在 mysql 容器窗口安装扩展。

安装 C/C++ 扩展:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

安装 CMake Tools 扩展:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

4、准备编译

在宿主机执行以下命令,进入 mysql 容器:

docker exec -ti mysql /bin/bash

在 mysql 容器中执行以下命令,下载源码、安装依赖软件:

# 创建存放源码的根目录
mkdir -p /opt/data/code

# 进入存放源码的根目录
cd /opt/data/code

# 安装 wget、下载源码 & 解压
yum install wget
wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-boost-8.0.32.tar.gz
tar zxvf mysql-boost-8.0.32.tar.gz

# 修改源码目录名
mv mysql-8.0.32 8.0.32

# 用于安装 cmake3 的 yum 源
yum -y install epel-release

# 用于安装高版本 gcc、gcc-c++、make 的 yum 源
yum -y install centos-release-scl

# 安装依赖软件
yum install devtoolset-11-gcc \
  devtoolset-11-gcc-c++ \
  devtoolset-11-make \
  cmake3 \
  openssl-devel \
  ncurses-devel \
  bison

# 安装 gdb
yum install devtoolset-11-gdb

# 让 scl 环境临时生效
source /opt/rh/devtoolset-11/enable

# 让 scl 环境永久生效
yum install vim
vim /etc/profile.d/scl.sh

# 把以下内容写入 scl.sh,然后保存退出
source /opt/rh/devtoolset-11/enable
5、编译

编译过程按以下步骤进行:

第 1 步,在 mysql 容器窗口中打开刚下载的 MySQL 源码目录:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

第 2 步,创建 .vscode 目录:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

第 3 步,新建 CMake 配置文件 settings.json:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

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++: internal compiler error: Killed (program cc1plus)

方案 1:把 cmake.parallelJobs 设置的小一点,我在编译过程中把并发数设置为 10 会报错,后来改为 8 就能成功编译了。

方案 2:​在 Docker Desktop 中调整容器能够使用的资源,如下:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

想要编译的更快,可以把 cmake.parallelJobs 设置为 0,然后,在以上 Docker Desktop 界面中,把 CPU、Memory 两项调大。

第 4 步,CMake 配置​,生成 Makefile 文件:在 ​mysql 容器窗口​顶部的输入框中,输入 > CMake: 配置​,然后选择下面列出来的 CMake 配置,开始生成 Makefile 文件。

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

选择编译器:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

如果 CMake:配置执行过程中出现了错误,解决错误之后需要删除 CMakeCache.txt,然后重新执行 CMake:配置步骤。

CMakeCache.txt 文件路径为 /opt/data/code/8.0.32/output/CMakeCache.txt。

第 5 步,编译服务端可执行程序 mysqld:

在输入框中输入“> CMake: 生成目标”,选中第 2 个红框中的选项。

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

接着会出现另一个输入框,在其中输入 mysqld,然后回车,就开始编译 mysqld 了。

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

第 6 步,编译客户端可执行程序 mysql:
在输入框中输入“> CMake: 生成目标”,选中第 2 个红框中的选项。

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

接着会出现另一个输入框,在其中输入 mysql,然后回车,就开始编译 mysql 了。

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

6、初始化

接下来,依然是在 mysql 容器中执行以下命令:

# 创建配置文件目录 & 数据目录
mkdir -p /opt/data/8.0.32/{etc,data}

# 创建用户 & 组
groupadd mysql
useradd -g mysql mysql

# 创建配置文件
vim /opt/data/8.0.32/etc/my.cnf

# 把以下内容下入 my.cnf
[mysqld]
user=mysql
innodb_file_per_table=1
server_id=100
log_bin=ON
lc-messages-dir=/opt/data/code/8.0.32/output/share
log-error=/opt/data/8.0.32/error.log

# 初始化数据目录
/opt/data/code/8.0.32/output/bin/mysqld --initialize-insecure
7、调试

经过前面一系列操作之后,就可以开始着手在 mysql 容器窗口中调试了。

第 1 步,新建配置文件 launch.json:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

launch.json 文件内容如下:

{
  "version": "0.2.0",
  "configurations": [
    {"name": "(gdb) 启动",
      "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": "将反汇编风格设置为 Intel",
          "text": "-gdb-set disassembly-flavor intel",
          "ignoreFailures": true
        }
      ]
    }
  ]
}

第 2 步,启动调试,launch.json 文件配置完成之后,运行和调试下拉框就能看到刚刚添加的配置,点击 (gdb) 启动前面的小三角,启动 MySQL,然后就可以开始调试了。

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

第 3 步,在 mysql 容器的命令行中,通过前面编译的客户端可执行程序 mysql,连接 MySQL:

cd /opt/data/code/8.0.32/output/bin
./mysql -h127.0.0.1 -uroot

第 4 步,连接 MySQL 成功之后,在 MySQL 源码中打个断点,先打开 sql/sql_parse.cc 文件:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

然后在 mysql_execute_command() 函数入口处打上断点:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

第 5 步,执行一条 SQL:

SELECT host, user FROM mysql.user;

程序在断点处暂停之后,就可以查看一系列运行时信息了,查看断点所在函数的局部变量:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

查看断点处的调用栈:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

也可以在调试控制台中,用命令行执行更多 gdb 命令:

VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境

VSCode + Docker 调试,需要在命令之前加上 -exec,上图中命令 p thd->m_query_string 前面就加上了 -exec。

8、总结

本文介绍了 VSCode + Docker + CentOS 7.9 搭建 MySQL 调试环境的完整流程。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计4637字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7800484
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
亚马逊云崩完,微软云崩!当全球第二大云“摔了一跤”:Azure 宕机背后的配置风险与警示

亚马逊云崩完,微软云崩!当全球第二大云“摔了一跤”:Azure 宕机背后的配置风险与警示

亚马逊云崩完,微软云崩!当全球第二大云“摔了一跤”:Azure 宕机背后的配置风险与警示 首先来回顾一下 10...
星哥带你玩飞牛NAS-8:有了NAS你可以干什么?软件汇总篇

星哥带你玩飞牛NAS-8:有了NAS你可以干什么?软件汇总篇

星哥带你玩飞牛 NAS-8:有了 NAS 你可以干什么?软件汇总篇 前言 哈喽各位玩友!我是是星哥,不少朋友私...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

还在忍受动辄数百兆的“全家桶”监控软件?后台偷占资源、界面杂乱冗余,想查个 CPU 温度都要层层点选? 今天给...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装 Black 群晖 DSM7.2 系统安装教程(在 Vmware 虚拟机中、实体机均可)! 前言 大家好,...
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比 星哥玩云,带你从小白到上云高手。今天咱们就来聊聊——什...
还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手! 前言 对于个人开发者、建站新手或是想搭建测试站点的从业者...