之前介绍过Linux下源码编译的方法(https://www.modb.pro/db/42279)。作为DBA,既然进行编译,那就看看怎样进行源码调试。
之前在win平台下使用Visual Studio环境配置编译,整个编译过程比在Linux上编译更痛苦。也有一些介绍的方式:比如:通过LLDB远程调试,但也存在lldb版本或插件协调问题。
所以不需要在win上折腾,直接在Linux系统编译,使用Visual Studio Code作为调试的工具。目前Visual Studio Code支持win和Linux系统,非常方便。Linux操作系统需要安装GNOME-Desktop桌面。
本环境直接CentOS8.3+MySQL8.0.23 进行源码调试。
1)安装Visual Studio Code
访问Visual Studio Code官网 下载Linux版本
https://code.visualstudio.com/
[root@os83 debug]# tar -xvf code-stable-x64-1617808689.tar.gz
VSCode-linux-x64/
VSCode-linux-x64/chrome_200_percent.pak
VSCode-linux-x64/libvulkan.so
。。。。。。
VSCode-linux-x64/locales/kn.pak
VSCode-linux-x64/locales/it.pak
VSCode-linux-x64/locales/ko.pak
启动VSCode:
[root@os83 VSCode-linux-x64]# cd ..
[root@os83 debug]# ./VSCode-linux-x64/code --no-sandbox
Warning: 'sandbox' is not in the list of known options, but still passed to Electron/Chromium.
[main 2021-05-02T17:07:55.478Z] update#setState idle
配置代码
把之前编译的MySQL文件夹,加载进来如下:
代码已经加载进来了。
安装3个组件
在左边的菜单组件(Extensions)
Linux with glibc 2.18+ (e.g. Debian 8, Ubuntu 14.04, Centos 8) for x86_64, aarch64 or armhf architecture,
MacOS X 10.10+ for x86_64 and 11.0+ for arm64 architecture,
Windows 10 for x86_64 architecture.
[root@os83 ~]# ldd --version
ldd (GNU libc) 2.28
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
配置启动文件
launch.json:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "lldb",
"request": "launch",
"program": "/opt/idc/debug/mysql-8.0.23/bin/mysqld",
"args": ["--defaults-file=/etc/my.cnf", "--user=mysql"],
}
]
}
- type必须选择lldb,LLDB是XCode内置的为我们开发者提供的调试工具,它与LLVM编译器一起,存在于主窗口底部的控制台中,能够带给我们更丰富的流程控制和数据检测的调试功能。
- 允许在程序运行的特定时暂停它
- 查看变量的值
- 执行自定的指令
- 按照你所认为合适的步骤来操作程序的进展
2)program:选择mysqld路径
3)args:定义参数(需要先把my.cnf初始化)
备注:需要把插件更新关闭掉:防止插件更新,无法调试
- 『File』->『Preferences』->『Settings』->『Features』->『Extensions』
Auto Check Updates
Auto Update - 『File->『Preferences->『Settings->『Application->『Update』
Mode none
初始化调试
通过初始化过程,打断点,WATCH看过程:
mysql-8.0.23/sql/main.cc
int main(int argc, char **argv) { return mysqld_main(argc, argv); }
启动过程是从main.cc ->mysqld.cc文件里,包含一些初始化配置
在4728行~4736行,看到了一些平时没注意的参数:
1)MySQL服务器维护一个内存中的主机缓存,其中包含客户端主机名和IP地址信息,用于避免域名系统(DNS)查找。host_cache_size变量控制主机缓存的大小,以及公开缓存内容的Performance Schema host_cache表的大小。其实说起来跟skip-name-resolve检查客户端连接时DNS主机名查找有关系。
如果生产环境中必须开启,可以通过增加host_cache_size的值来使主机缓存更大来提高性能
2)back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。也就是说,如果MySql的连接数达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源
back_log值不能超过TCP/IP连接的侦听队列的大小。若超过则无效。
#查看当前系统的TCP/IP连接的侦听队列的大小
shell> cat /proc/sys/net/ipv4/tcp_max_syn_backlog
128
#修改系统内核参数并立即生效
shell> vim /etc/sysctl.conf
net.ipv4.tcp_max_syn_backlog = 2048
shell> sysctl -p
总结
源码调试过程也是对MySQL的理解,知识积累的过程,虽然时间耗费比较多,但有兴趣的技术同仁,可以自己尝试一下。
对于看懂源码方面具备的能力:其实也没必要把C,C++的整个代码逻辑理解,但肯定需要有代码功底,除此之外还需要对MySQL也基础的理解。