MySQL 源码调试简单入门

之前介绍过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/

image.png

[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文件夹,加载进来如下:
image.png
image.png
代码已经加载进来了。

安装3个组件

在左边的菜单组件(Extensions)
image.png

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.

注意:这里glibc版本需要 2.18+

[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编译器一起,存在于主窗口底部的控制台中,能够带给我们更丰富的流程控制和数据检测的调试功能。
  • 允许在程序运行的特定时暂停它
  • 查看变量的值
  • 执行自定的指令
  • 按照你所认为合适的步骤来操作程序的进展

image.png
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看过程:

main初始化

mysql-8.0.23/sql/main.cc
int main(int argc, char **argv) { return mysqld_main(argc, argv); }

image.png

启动过程是从main.cc ->mysqld.cc文件里,包含一些初始化配置

在4728行~4736行,看到了一些平时没注意的参数:
image.png
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也基础的理解。

Guess you like

Origin blog.csdn.net/dreamyuzhou/article/details/117483463