一、編譯安裝MySQL8.0.18
1.1 安裝依賴包
yum -y install ntpdate gcc gcc-c++ ncurses ncurses-devel cmake readline-devel zlib.x86_64 zlib-devel.x86_64 bison libcurl-* net-tool* tree nmap sysstat lrzsz dos2unix telnet.x86_64 nethogs iftop iotop unzip ftp.x86_64 xfs* expect vim wget psmisc openssh-client* libaio libaio1 libnuma openssl-devel bzip2 flex clang
1.2 基礎環境配置
#關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
#關閉postfix
systemctl stop postfix
systemctl disable postfix
#關閉SELINUX
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
getenforce
#關閉numa
sed -i 's/GRUB_CMDLINE_LINUX.*/GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos\/root rd.lvm.lv=centos\/swap rhgb quiet numa=off"/g' /etc/default/grub
grub2-mkconfig -o /etc/grub2.cfg
cat /etc/grub2.cfg
reboot
cat /proc/cmdline
dmesg | grep -i numa
#核心參數修改
echo "vm.swappiness=10">>/etc/sysctl.conf
echo "net.ipv4.tcp_tw_recycle=1">>/etc/sysctl.conf
echo "net.ipv4.tcp_tw_reuse=1">>/etc/sysctl.conf
echo "vm.dirty_background_ratio=8">>/etc/sysctl.conf
echo "* soft nproc 65536" >>/etc/security/limits.conf
echo "* hard nproc 65536" >>/etc/security/limits.conf
echo "* soft nofile 65536" >>/etc/security/limits.conf
echo "* hard nproc 65536" >>/etc/security/limits.conf
#建立使用者
useradd -M -s /sbin/nologin mysql
#建立相關目錄
mkdir -pv /data/{conf,redo1,redo2,mysql3306/{data,tmp,logs}}
#授權
chown -R mysql:mysql /data/mysql3306/
1.3 配置環境變量
export PATH=$PATH:/usr/local/mysql/bin:
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
1.4 更新gcc
mkdir /usr/local/gcc && cd /usr/local/gcc
wget https://github.com/gcc-mirror/gcc/archive/gcc-5_5_0-release.tar.gz
tar xf gcc-5.5.0.tar.xz
cd gcc-gcc-5_5_0-release
./contrib/download_prerequisites
mkdir build && cd build
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
make && make install
1.5 更新cmake
mkdir /usr/local/cmake && cd /usr/local/cmake
wget https://github.com/Kitware/CMake/releases/download/v3.14.5/cmake-3.14.5.tar.Z
./bootstrap
make && make install
#如果出現以下類似錯誤,需要更新libstdc++:
libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./destructor)
strings ./libstdc++.so.6 | grep CXXABI
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_TM_1
mv /usr/lib64/libstdc++.so.6.0.19 /tmp/
cp /usr/local/gcc/gcc-gcc-5_5_0-release/build/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21 /usr/lib64/
mv /usr/lib64/libstdc++.so.6 /tmp/
ln -s libstdc++.so.6.0.21 libstdc++.so.6
1.6 編譯安裝MySQL
cd ~
tar xf mysql-boost-8.0.18.tar.gz
cd mysql-8.0.18
cmake . \
-DWITH_BOOST=/root/mysql-8.0.18/boost/boost_1_70_0 \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql3306/data \
-DWITHOUT_CSV_STORAGE_ENGINE=1 \
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1 \
-DWITHOUT_ARCHIVE_STORAGE_ENGINE=1 \
-DFORCE_INSOURCE_BUILD=1 \
-DWITH_SSL=system \
-DWITH_DEBUG=1 \
-DCMAKE_CXX_COMPILER=/usr/local/bin/g++ \
-DCMAKE_C_COMPILER=/usr/local/bin/gcc
# -j 表示使用幾個CPU同時編譯
make -j 2
make install
1.7 初始化&啟動資料庫
#編輯配置檔案
vi /data/conf/my.cnf
#建立軟連結
ln -s /data/conf/my.cnf /etc/my.cnf
#初始化資料庫
mysqld --defaults-file=/etc/my.cnf --initialize-insecure &
#啟動資料庫
mysqld_safe --defaults-file=/etc/my.cnf &
#登陸後修改密碼
mysql
alter user root@localhost identified by 'xxx';
二、調試環境配置
2.1 調試工具基本使用
#安裝調試工具gdb
yum install -y gdb
gdb常用選項:
指令 | 指令縮寫 | 指令說明 |
---|---|---|
attach | 挂接程序的PID | |
detach | 取消挂接的程序 | |
list | l | 顯示多行源代碼 |
break | b | 設定斷點,程式運作到斷點的位置會停下來 |
info | i | 描述程式的狀态 |
run | r | 開始運作程式 |
display | disp | 跟蹤檢視某個變量,每次停下來都顯示它的值 |
step | s | 執行下一條語句,如果該語句為函數調用,則進入函數執行其中的第一條語句 |
next | n | 執行下一條語句,如果該語句為函數調用,不會進入函數内部執行(即不會一步步地調試函數内部語句) |
p | 列印内部變量值 | |
continue | c | 繼續程式的運作,直到遇到下一個斷點 |
set var name=v | 設定變量的值 | |
start | st | 開始執行程式,在main函數的第一條語句前面停下來 |
file | 裝入需要調試的程式 | |
kill | k | 終止正在調試的程式 |
watch | 監視變量值的變化 | |
backtrace | bt | 檢視函數調用資訊(堆棧) |
frame | f | 檢視棧幀 |
quit | q | 退出GDB環境 |
2.2 MySQL和OS線程的對應關系
mysqld是一個單程序多線程的程式,程序實際上就是運作中的程式,一個程序中可以包含一個或多個線程。一個程序内部的所有線程都擁有相同的代碼程式、堆、全局變量、共享庫等,但是每個線程擁有自己獨立棧空間和寄存器,他們共享程序的虛拟記憶體位址空間。在Linux中線程也叫輕量級程序(LWP)。程序是記憶體配置設定的最小機關,線程是CPU排程的最小機關,也就是說如果CPU是多核,那麼多個線程可以達到并行處理的效果,核心直接排程線程。在OS上通過
ps -eLlf
可以檢視線程ID LWP:

通過performance_schema.threads表可以檢視作業系統線程号與mysql哪個功能線程相對應:
root@mysql8 16:42: [(none)]> select THREAD_ID,PROCESSLIST_ID,THREAD_OS_ID,name,TYPE from performance_schema.threads;
+-----------+----------------+--------------+---------------------------------------------+------------+
| THREAD_ID | PROCESSLIST_ID | THREAD_OS_ID | name | TYPE |
+-----------+----------------+--------------+---------------------------------------------+------------+
| 1 | NULL | 3117 | thread/sql/main | BACKGROUND |
| 3 | NULL | 3124 | thread/innodb/io_ibuf_thread | BACKGROUND |
| 4 | NULL | 3125 | thread/innodb/io_log_thread | BACKGROUND |
| 5 | NULL | 3126 | thread/innodb/io_read_thread | BACKGROUND |
| 6 | NULL | 3127 | thread/innodb/io_read_thread | BACKGROUND |
| 7 | NULL | 3128 | thread/innodb/io_read_thread | BACKGROUND |
| 8 | NULL | 3129 | thread/innodb/io_read_thread | BACKGROUND |
| 9 | NULL | 3130 | thread/innodb/io_read_thread | BACKGROUND |
| 10 | NULL | 3131 | thread/innodb/io_read_thread | BACKGROUND |
| 11 | NULL | 3132 | thread/innodb/io_read_thread | BACKGROUND |
| 12 | NULL | 3133 | thread/innodb/io_read_thread | BACKGROUND |
| 13 | NULL | 3134 | thread/innodb/io_write_thread | BACKGROUND |
| 14 | NULL | 3135 | thread/innodb/io_write_thread | BACKGROUND |
| 15 | NULL | 3136 | thread/innodb/io_write_thread | BACKGROUND |
| 16 | NULL | 3137 | thread/innodb/io_write_thread | BACKGROUND |
| 17 | NULL | 3138 | thread/innodb/io_write_thread | BACKGROUND |
| 18 | NULL | 3139 | thread/innodb/io_write_thread | BACKGROUND |
| 19 | NULL | 3140 | thread/innodb/io_write_thread | BACKGROUND |
| 20 | NULL | 3141 | thread/innodb/io_write_thread | BACKGROUND |
| 21 | NULL | 3142 | thread/innodb/page_flush_coordinator_thread | BACKGROUND |
| 22 | NULL | 3143 | thread/innodb/page_flush_thread | BACKGROUND |
| 23 | NULL | 3144 | thread/innodb/page_flush_thread | BACKGROUND |
| 24 | NULL | 3145 | thread/innodb/page_flush_thread | BACKGROUND |
| 25 | NULL | 3146 | thread/innodb/log_checkpointer_thread | BACKGROUND |
| 26 | NULL | 3147 | thread/innodb/log_closer_thread | BACKGROUND |
| 27 | NULL | 3148 | thread/innodb/log_flush_notifier_thread | BACKGROUND |
| 28 | NULL | 3149 | thread/innodb/log_flusher_thread | BACKGROUND |
| 29 | NULL | 3150 | thread/innodb/log_write_notifier_thread | BACKGROUND |
| 30 | NULL | 3151 | thread/innodb/log_writer_thread | BACKGROUND |
| 31 | NULL | 3152 | thread/innodb/srv_lock_timeout_thread | BACKGROUND |
| 32 | NULL | 3153 | thread/innodb/srv_error_monitor_thread | BACKGROUND |
| 33 | NULL | 3154 | thread/innodb/srv_monitor_thread | BACKGROUND |
| 34 | NULL | 3156 | thread/innodb/buf_resize_thread | BACKGROUND |
| 35 | NULL | 3157 | thread/innodb/srv_master_thread | BACKGROUND |
| 36 | NULL | 3158 | thread/innodb/dict_stats_thread | BACKGROUND |
| 37 | NULL | 3159 | thread/innodb/fts_optimize_thread | BACKGROUND |
| 38 | NULL | 3160 | thread/mysqlx/worker | BACKGROUND |
| 39 | NULL | 3161 | thread/mysqlx/worker | BACKGROUND |
| 40 | NULL | 3162 | thread/mysqlx/acceptor_network | BACKGROUND |
| 41 | NULL | 3163 | thread/mysqlx/acceptor_network | BACKGROUND |
| 44 | NULL | 3166 | thread/innodb/buf_dump_thread | BACKGROUND |
| 45 | NULL | 3167 | thread/innodb/clone_gtid_thread | BACKGROUND |
| 46 | NULL | 3168 | thread/innodb/srv_purge_thread | BACKGROUND |
| 47 | NULL | 3168 | thread/innodb/srv_purge_thread | BACKGROUND |
| 48 | NULL | 3169 | thread/innodb/srv_worker_thread | BACKGROUND |
| 49 | NULL | 3169 | thread/innodb/srv_worker_thread | BACKGROUND |
| 50 | NULL | 3170 | thread/innodb/srv_worker_thread | BACKGROUND |
| 51 | NULL | 3170 | thread/innodb/srv_worker_thread | BACKGROUND |
| 52 | NULL | 3171 | thread/innodb/srv_worker_thread | BACKGROUND |
| 53 | NULL | 3171 | thread/innodb/srv_worker_thread | BACKGROUND |
| 54 | 4 | 3172 | thread/sql/event_scheduler | FOREGROUND |
| 55 | NULL | 3173 | thread/sql/signal_handler | BACKGROUND |
| 56 | 6 | 3174 | thread/sql/compress_gtid_table | FOREGROUND |
| 59 | 9 | 3177 | thread/sql/one_connection | FOREGROUND |
+-----------+----------------+--------------+---------------------------------------------+------------+
54 rows in set (0.01 sec)
2.4 mysql調試基本使用
啟動gdb:
gdb
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-115.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb)
我們使用
attach
指令挂接mysql
gdb
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-115.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) attach 3117
Attaching to process 3117
Reading symbols from /usr/local/mysql/bin/mysqld...done.
Reading symbols from /lib64/libpthread.so.0...(no debugging symbols found)...done.
[New LWP 14341]
...
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Loaded symbols for /lib64/libpthread.so.0
Reading symbols from /usr/local/mysql/bin/../lib/private/libprotobuf-lite.so.3.6.1...done.
Loaded symbols for /usr/local/mysql/bin/../lib/private/libprotobuf-lite.so.3.6.1
Reading symbols from /lib64/libcrypt.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/libcrypt.so.1
Reading symbols from /lib64/librt.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/librt.so.1
Reading symbols from /lib64/libssl.so.10...Reading symbols from /lib64/libssl.so.10...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Loaded symbols for /lib64/libssl.so.10
Reading symbols from /lib64/libcrypto.so.10...Reading symbols from /lib64/libcrypto.so.10...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Loaded symbols for /lib64/libcrypto.so.10
Reading symbols from /lib64/libdl.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/libdl.so.2
Reading symbols from /lib64/libnuma.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/libnuma.so.1
Reading symbols from /lib64/libstdc++.so.6...done.
Loaded symbols for /lib64/libstdc++.so.6
Reading symbols from /lib64/libm.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libm.so.6
Reading symbols from /lib64/libgcc_s.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib64/libgcc_s.so.1
Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from /lib64/libfreebl3.so...Reading symbols from /usr/lib/debug/usr/lib64/libfreebl3.so.debug...done.
done.
Loaded symbols for /lib64/libfreebl3.so
Reading symbols from /lib64/libgssapi_krb5.so.2...Reading symbols from /lib64/libgssapi_krb5.so.2...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Loaded symbols for /lib64/libgssapi_krb5.so.2
Reading symbols from /lib64/libkrb5.so.3...Reading symbols from /lib64/libkrb5.so.3...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Loaded symbols for /lib64/libkrb5.so.3
Reading symbols from /lib64/libcom_err.so.2...Reading symbols from /lib64/libcom_err.so.2...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Loaded symbols for /lib64/libcom_err.so.2
Reading symbols from /lib64/libk5crypto.so.3...Reading symbols from /lib64/libk5crypto.so.3...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Loaded symbols for /lib64/libk5crypto.so.3
Reading symbols from /lib64/libz.so.1...Reading symbols from /lib64/libz.so.1...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Loaded symbols for /lib64/libz.so.1
Reading symbols from /lib64/libkrb5support.so.0...Reading symbols from /lib64/libkrb5support.so.0...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Loaded symbols for /lib64/libkrb5support.so.0
Reading symbols from /lib64/libkeyutils.so.1...Reading symbols from /lib64/libkeyutils.so.1...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Loaded symbols for /lib64/libkeyutils.so.1
Reading symbols from /lib64/libresolv.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/libresolv.so.2
Reading symbols from /lib64/libselinux.so.1...Reading symbols from /lib64/libselinux.so.1...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Loaded symbols for /lib64/libselinux.so.1
Reading symbols from /lib64/libpcre.so.1...Reading symbols from /lib64/libpcre.so.1...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Loaded symbols for /lib64/libpcre.so.1
Reading symbols from /lib64/libnss_files.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/libnss_files.so.2
0x00007fe69f0d2bed in poll () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.17-292.el7.x86_64 keyutils-libs-1.5.8-3.el7.x86_64 krb5-libs-1.15.1-37.el7_7.2.x86_64 libcom_err-1.42.9-16.el7.x86_64 libgcc-4.8.5-39.el7.x86_64 libnuma1-2.0.12-4.1.x86_64 libselinux-2.5-14.1.el7.x86_64 openssl-libs-1.0.2k-19.el7.x86_64 pcre-8.32-17.el7.x86_64 zlib-1.2.7-18.el7.x86_64
從輸出中可以看出缺少一些包,需要額外安裝:
#安裝對應版本的debuginfo
rpm -ivh kernel-debuginfo-common-x86_64-3.10.0-1062.el7.x86_64.rpm
rpm -ivh kernel-debuginfo-3.10.0-1062.el7.x86_64.rpm
#安裝相關包
yum install -y nss-softokn-debuginfo --nogpgcheck
yum install -y yum-utils
debuginfo-install glibc-2.17-292.el7.x86_64 keyutils-libs-1.5.8-3.el7.x86_64 krb5-libs-1.15.1-37.el7_7.2.x86_64 libcom_err-1.42.9-16.el7.x86_64 libgcc-4.8.5-39.el7.x86_64 libnuma1-2.0.12-4.1.x86_64 libselinux-2.5-14.1.el7.x86_64 openssl-libs-1.0.2k-19.el7.x86_64 pcre-8.32-17.el7.x86_64 zlib-1.2.7-18.el7.x86_64
下面來完整的示範調試過程
#首先擷取mysqld程序的PID
[root@mysql8 tmp]# ps -ef | grep mysql
root 8371 8230 0 17:41 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf
mysql 9916 8371 1 17:41 pts/0 00:00:12 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql3306/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql3306/logs/error.log --open-files-limit=65535 --pid-file=mysql8.pid --socket=/data/mysql3306/data/mysql.sock --port=3306
#然後使用gdb指令進行調試
[root@mysql8 ~]# gdb /usr/local/mysql/bin/mysqld 9916
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-115.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /usr/local/mysql/bin/mysqld...done.
Attaching to program: /usr/local/mysql/bin/mysqld, process 9916
Reading symbols from /lib64/libpthread.so.0...Reading symbols from /usr/lib/debug/usr/lib64/libpthread-2.17.so.debug...done.
done.
[New LWP 10064]
...
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Loaded symbols for /lib64/libpthread.so.0
Reading symbols from /usr/local/mysql/bin/../lib/private/libprotobuf-lite.so.3.6.1...done.
Loaded symbols for /usr/local/mysql/bin/../lib/private/libprotobuf-lite.so.3.6.1
Reading symbols from /lib64/libcrypt.so.1...Reading symbols from /usr/lib/debug/usr/lib64/libcrypt-2.17.so.debug...done.
done.
Loaded symbols for /lib64/libcrypt.so.1
Reading symbols from /lib64/librt.so.1...Reading symbols from /usr/lib/debug/usr/lib64/librt-2.17.so.debug...done.
done.
Loaded symbols for /lib64/librt.so.1
Reading symbols from /lib64/libssl.so.10...Reading symbols from /usr/lib/debug/usr/lib64/libssl.so.1.0.2k.debug...done.
done.
Loaded symbols for /lib64/libssl.so.10
Reading symbols from /lib64/libcrypto.so.10...Reading symbols from /usr/lib/debug/usr/lib64/libcrypto.so.1.0.2k.debug...done.
done.
Loaded symbols for /lib64/libcrypto.so.10
Reading symbols from /lib64/libdl.so.2...Reading symbols from /usr/lib/debug/usr/lib64/libdl-2.17.so.debug...done.
done.
Loaded symbols for /lib64/libdl.so.2
Reading symbols from /lib64/libnuma.so.1...done.
Loaded symbols for /lib64/libnuma.so.1
Reading symbols from /lib64/libstdc++.so.6...done.
Loaded symbols for /lib64/libstdc++.so.6
Reading symbols from /lib64/libm.so.6...Reading symbols from /usr/lib/debug/usr/lib64/libm-2.17.so.debug...done.
done.
Loaded symbols for /lib64/libm.so.6
Reading symbols from /lib64/libgcc_s.so.1...Reading symbols from /usr/lib/debug/usr/lib64/libgcc_s-4.8.5-20150702.so.1.debug...done.
done.
Loaded symbols for /lib64/libgcc_s.so.1
Reading symbols from /lib64/libc.so.6...Reading symbols from /usr/lib/debug/usr/lib64/libc-2.17.so.debug...done.
done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug/usr/lib64/ld-2.17.so.debug...done.
done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from /lib64/libfreebl3.so...Reading symbols from /usr/lib/debug/usr/lib64/libfreebl3.so.debug...done.
done.
Loaded symbols for /lib64/libfreebl3.so
Reading symbols from /lib64/libgssapi_krb5.so.2...Reading symbols from /usr/lib/debug/usr/lib64/libgssapi_krb5.so.2.2.debug...done.
done.
Loaded symbols for /lib64/libgssapi_krb5.so.2
Reading symbols from /lib64/libkrb5.so.3...Reading symbols from /usr/lib/debug/usr/lib64/libkrb5.so.3.3.debug...done.
done.
Loaded symbols for /lib64/libkrb5.so.3
Reading symbols from /lib64/libcom_err.so.2...Reading symbols from /usr/lib/debug/usr/lib64/libcom_err.so.2.1.debug...done.
done.
Loaded symbols for /lib64/libcom_err.so.2
Reading symbols from /lib64/libk5crypto.so.3...Reading symbols from /usr/lib/debug/usr/lib64/libk5crypto.so.3.1.debug...done.
done.
Loaded symbols for /lib64/libk5crypto.so.3
Reading symbols from /lib64/libz.so.1...Reading symbols from /usr/lib/debug/usr/lib64/libz.so.1.2.7.debug...done.
done.
Loaded symbols for /lib64/libz.so.1
Reading symbols from /lib64/libkrb5support.so.0...Reading symbols from /usr/lib/debug/usr/lib64/libkrb5support.so.0.1.debug...done.
done.
Loaded symbols for /lib64/libkrb5support.so.0
Reading symbols from /lib64/libkeyutils.so.1...Reading symbols from /usr/lib/debug/usr/lib64/libkeyutils.so.1.5.debug...done.
done.
Loaded symbols for /lib64/libkeyutils.so.1
Reading symbols from /lib64/libresolv.so.2...Reading symbols from /usr/lib/debug/usr/lib64/libresolv-2.17.so.debug...done.
done.
Loaded symbols for /lib64/libresolv.so.2
Reading symbols from /lib64/libselinux.so.1...Reading symbols from /usr/lib/debug/usr/lib64/libselinux.so.1.debug...done.
done.
Loaded symbols for /lib64/libselinux.so.1
Reading symbols from /lib64/libpcre.so.1...Reading symbols from /usr/lib/debug/usr/lib64/libpcre.so.1.2.0.debug...done.
done.
Loaded symbols for /lib64/libpcre.so.1
Reading symbols from /lib64/libnss_files.so.2...Reading symbols from /usr/lib/debug/usr/lib64/libnss_files-2.17.so.debug...done.
done.
Loaded symbols for /lib64/libnss_files.so.2
0x00007f88d3ab4bed in poll () at ../sysdeps/unix/syscall-template.S:81
81 T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
#設定斷點,比如在mysql_execute_command函數設定斷點
(gdb) b mysql_execute_command
Breakpoint 1 at 0x350d370: file /usr/local/tools/mysql-8.0.18/sql/sql_parse.cc, line 2625.
#再起一個終端連接配接到MySQL,執行指令
select version();
#此時在gdb會話終端,會停在斷點處,執行指令:p thd->m_query_string,可以看到斷點處,thd變量内部的成員變量記錄着目前正在執行的SQL語句:
(gdb) p thd->m_query_string
$1 = {str = 0x7f87b000c6f8 "select version()", length = 16}
#此時執行bt指令檢視函數調用資訊:
(gdb) bt
#0 mysql_execute_command (thd=0x7f87b0000d70, first_level=true)
at /usr/local/tools/mysql-8.0.18/sql/sql_parse.cc:2625
#1 0x000000000351561a in mysql_parse (thd=0x7f87b0000d70, parser_state=0x7f87d40f0b20)
at /usr/local/tools/mysql-8.0.18/sql/sql_parse.cc:5257
#2 0x000000000350aa63 in dispatch_command (thd=0x7f87b0000d70, com_data=0x7f87d40f1bd0,
command=COM_QUERY) at /usr/local/tools/mysql-8.0.18/sql/sql_parse.cc:1765
#3 0x0000000003508fa8 in do_command (thd=0x7f87b0000d70)
at /usr/local/tools/mysql-8.0.18/sql/sql_parse.cc:1273
#4 0x00000000036ca595 in handle_connection (arg=0x87c16b0)
at /usr/local/tools/mysql-8.0.18/sql/conn_handler/connection_handler_per_thread.cc:302
#5 0x0000000005183038 in pfs_spawn_thread (arg=0x89c8800)
at /usr/local/tools/mysql-8.0.18/storage/perfschema/pfs.cc:2854
#6 0x00007f88d5600e65 in start_thread (arg=0x7f87d40f2700) at pthread_create.c:307
#7 0x00007f88d3abf88d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111
#使用c指令繼續運作,直到遇到下一個斷點
三、總結
本文簡單介紹了如何編譯安裝MySQL8.0,并且進行簡單的調試。