GDB调试MySQL
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,GDB主要帮助你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当程序被停住时
千家信息网最后更新 2025年11月13日GDB调试MySQLGDB主要帮助你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
在学习Oracle的时候使用GDB调试,主要是关于学习Oracle的闩锁原理,那么,为什么要用GDB调试MySQL 1.识别故障 2.场景重现 3.创建测试案例确认BUG 4.定位缺陷根源 5.测试和创建补丁修复BUG
下面开始学习GDB调试MySQL 1、安装编译MySQL需要的软件包 yum install -y cmake make gcc gcc-c++ ncurses-devel bison gdb
2、编译MySQL # git clone https://github.com/mysql/mysql-server.git # cd mysql-server # git checkout mysql-5.7.19 # cd BUILD; cmake .. -DDOWNLOAD_BOOST=1 -DWITH_DEBUG=1 -DWITH_UNIT_TESTS=off # make # make install
3、连接MySQL程序 3.1、查看MySQL进程ID
3.2、GDB使用attach连接MySQL进程ID
4、设置断点 4.1、查看插入语句的源码sql_insert.cc的423行的函数Sql_cmd_insert::mysql_insert
4.2、在session1中的gdb设置insert的断点
4.3、查看断点信息,从下往上看,使用到了多个MySQL函数。
4.4、在设置了断点之后,在另一个session2中登录数据库,发现无法登录,hung住了,在gdb中执行next(执行下一步代码),可以看到在socket_connection.cc源码第859行无法继续,代码大致是说要获取系统的socket,还有一些监听信息,由于太多了,直接在gdb中执行continue(到下一个可执行的代码),此时session2已经登录成功。
4.5、session2此时的select操作都是一切正常的
4.6、session2做insert操作的时候,又一次hung住了,session1打印出了断点的信息,在mysql_insert:423行,直到执行continue,session2才能正常插入数据。
在学习Oracle的时候使用GDB调试,主要是关于学习Oracle的闩锁原理,那么,为什么要用GDB调试MySQL 1.识别故障 2.场景重现 3.创建测试案例确认BUG 4.定位缺陷根源 5.测试和创建补丁修复BUG
下面开始学习GDB调试MySQL 1、安装编译MySQL需要的软件包 yum install -y cmake make gcc gcc-c++ ncurses-devel bison gdb
2、编译MySQL # git clone https://github.com/mysql/mysql-server.git # cd mysql-server # git checkout mysql-5.7.19 # cd BUILD; cmake .. -DDOWNLOAD_BOOST=1 -DWITH_DEBUG=1 -DWITH_UNIT_TESTS=off # make # make install
3、连接MySQL程序 3.1、查看MySQL进程ID
| [root@debug ~]# ps -ef | grep mysql root 24589 1 0 07:58 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql mysql 24794 24589 0 07:58 ? 00:00:01 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/mysql-debug.log --pid-file=debug.pid --socket=/tmp/mysql.sock --port=3306 root 25009 24993 0 11:29 pts/2 00:00:00 grep mysql |
3.2、GDB使用attach连接MySQL进程ID
| [root@debug ~]# gdb GNU gdb (GDB) Red Hat Enterprise Linux (7.2-92.el6) Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later |
4、设置断点 4.1、查看插入语句的源码sql_insert.cc的423行的函数Sql_cmd_insert::mysql_insert
| bool Sql_cmd_insert::mysql_insert(THD *thd,TABLE_LIST *table_list) { DBUG_ENTER("mysql_insert"); LEX *const lex= thd->lex; int error, res; bool err= true; bool transactional_table, joins_freed= FALSE; bool changed; bool is_locked= false; ulong counter= 0; ulonglong id; |
4.2、在session1中的gdb设置insert的断点
| (gdb) b Sql_cmd_insert::mysql_insert Breakpoint 1 at 0x17bd1b9: file /root/mysql-server/sql/sql_insert.cc, line 423. |
4.3、查看断点信息,从下往上看,使用到了多个MySQL函数。
| (gdb) bt #0 0x00007f8801dfd383 in poll () from /lib64/libc.so.6 #1 0x00000000016c1155 in Mysqld_socket_listener::listen_for_connection_event (this=0x45d8870) at /root/mysql-server/sql/conn_handler/socket_connection.cc:852 #2 0x0000000000ece89c in Connection_acceptor |
4.4、在设置了断点之后,在另一个session2中登录数据库,发现无法登录,hung住了,在gdb中执行next(执行下一步代码),可以看到在socket_connection.cc源码第859行无法继续,代码大致是说要获取系统的socket,还有一些监听信息,由于太多了,直接在gdb中执行continue(到下一个可执行的代码),此时session2已经登录成功。
| (gdb) n Single stepping until exit from function poll, which has no line number information. Mysqld_socket_listener::listen_for_connection_event (this=0x45d8870) at /root/mysql-server/sql/conn_handler/socket_connection.cc:859 859 if (retval < 0 && socket_errno != SOCKET_EINTR) (gdb) n 871 if (retval < 0 || abort_loop) (gdb) n 876 MYSQL_SOCKET listen_sock= MYSQL_INVALID_SOCKET; (gdb) n 877 bool is_unix_socket= false; (gdb) n 879 for (uint i= 0; i < m_socket_map.size(); ++i) (gdb) n 881 if (m_poll_info.m_fds[i].revents & POLLIN) (gdb) n 879 for (uint i= 0; i < m_socket_map.size(); ++i) (gdb) n 881 if (m_poll_info.m_fds[i].revents & POLLIN) (gdb) n 883 listen_sock= m_poll_info.m_pfs_fds[i]; (gdb) n 884 is_unix_socket= m_socket_map[listen_sock]; (gdb) n 885 break; (gdb) n 904 for (uint retry= 0; retry < MAX_ACCEPT_RETRY; retry++) (gdb) n 906 socket_len_t length= sizeof(struct sockaddr_storage); (gdb) n 908 (struct sockaddr *)(&cAddr), &length); (gdb) n 909 if (mysql_socket_getfd(connect_sock) != INVALID_SOCKET || (gdb) n … ... (gdb) c Continuing. |
4.5、session2此时的select操作都是一切正常的
| [root@localhost:(none)][11:41:15am] MySQL-> use test; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed [root@localhost:test][11:49:12am] MySQL-> show tables; +----------------+ | Tables_in_test | +----------------+ | t | | t1 | +----------------+ 2 rows in set (0.00 sec) [root@localhost:test][11:49:16am] MySQL-> select * from t; +------+------+ | id | name | +------+------+ | 1 | aaa | | 2 | aaa | | 3 | aaa | | 4 | aaa | +------+------+ 4 rows in set (0.00 sec) |
4.6、session2做insert操作的时候,又一次hung住了,session1打印出了断点的信息,在mysql_insert:423行,直到执行continue,session2才能正常插入数据。
| (gdb) c Continuing. [Switching to Thread 0x7f87e00b4700 (LWP 24824)] Breakpoint 1, Sql_cmd_insert::mysql_insert (this=0x7f87f40147b8, thd=0x7f87f401bc60, table_list=0x7f87f4013fe0) at /root/mysql-server/sql/sql_insert.cc:423 423 DBUG_ENTER("mysql_insert"); (gdb) n 425 LEX *const lex= thd->lex; (gdb) n 427 bool err= true; (gdb) c Continuing. |
程序
断点
信息
学习
测试
登录
代码
函数
数据
时候
源码
进程
编译
成功
随心所欲
功能
原理
场景
多个
所欲
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全师要学什么意思
战争时网络安全
网络技术人员匮乏
奥的斯服务器怎么查故障具体步骤
机械手数据库
jsp项目如何修改数据库
校本研修网络安全
车路协同系统服务器部署
公司网络安全解决方案的流程
数据库常用的安全措施
集团公司网络安全和信息
软件开发需要打字地方多吗
异业联盟软件开发公司哪家好
机房服务器灯光
震荡网络安全概念
服务器时间可以修改吗
服务器管理口英文名称
plc编程软件开发商
有实力的存储服务器哪家好
在sci数据库检索侯建国
网络安全领域工作汇报
国内软件开发公司 聚顶科技好
现成的数据库代码
网络安全宣传先进个人
星载服务器
湖南新一代软件开发价格监测中心
软件开发 人数6
uml在软件开发中的贡献
户县软件开发行情
网络安全为什么是重要战略