In addition to Weibo, there is also WeChat
Please pay attention
WeChat public account
Shulou
2025-04-10 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Database >
Share
Shulou(Shulou.com)06/01 Report--
GDB mainly helps you to complete the following four aspects of functions: 1, start your program, you can run the program at will according to your custom requirements. 2. Allow the debugged program to stop at the breakpoint of the setting you specify. (breakpoints can be conditional expressions) 3. When the program is stopped, you can check what is happening in your program at this time. 4. You can change your program to correct the impact of one BUG to test other BUG.
Using GDB debugging when learning Oracle is mainly about learning the latch principle of Oracle, so why use GDB to debug MySQL 1. 0. Identify fault 2. Scene reproduction 3. Create a test case to confirm BUG 4. Locate the root cause of the defect 5. Test and create patches to fix BUG
Let's start to learn how to debug MySQL 1 with GDB and install the software package yum install-y cmake make gcc gcc-c++ ncurses-devel bison gdb needed to compile MySQL.
2. Compile 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. Connect the MySQL program 3.1, View the MySQL process ID [root@debug ~] # ps-ef | grep mysql root 24589 10 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
GDB uses attach to connect the MySQL process 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 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:. (gdb) attach 24794 Attaching to process 24794 Reading symbols from / usr/local/mysql/bin/mysqld...done Reading symbols from / lib64/libpthread.so.0... (no debugging symbols found)... done. [New LWP 24969] [New LWP 24824] [New LWP 24821] [New LWP 24820] [New LWP 24819] [New LWP 24818] [New LWP 24817] [New LWP 24816] [New LWP 24815] [New LWP 24814] [New LWP 24813] [New LWP 24812] [New LWP 24811] [New LWP 24810] [New LWP 24809] [New LWP 24808] [New LWP 24806] [New LWP 24805] [New LWP 24804] [New LWP 24803] [New LWP 24802] [New LWP 24801] [New LWP 24800] [New LWP 24799] [New LWP 24798] [New LWP 24797] [New LWP 24796] [New LWP 24795] [Thread debugging using libthread_db enabled] Loaded symbols for / lib64/libpthread.so.0 Reading symbols from / lib64/libcrypt.so.1... (no debugging symbols found). Done. Loaded symbols for / lib64/libcrypt.so.1 Reading symbols from / lib64/libdl.so.2... (no debugging symbols found). Done. Loaded symbols for / lib64/libdl.so.2 Reading symbols from / lib64/librt.so.1... (no debugging symbols found). Done. Loaded symbols for / lib64/librt.so.1 Reading symbols from / usr/lib64/libstdc++.so.6... (no debugging symbols found). Done. Loaded symbols for / usr/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... (no debugging symbols found). Done. Loaded symbols for / lib64/libfreebl3.so Reading symbols from / lib64/libnss_files.so.2... (no debugging symbols found). Done. Loaded symbols for / lib64/libnss_files.so.2 0x00007f8801dfd383 in poll () from / lib64/libc.so.6 Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.209.el6_9.2.x86_64 libgcc-4.4.7-18.el6.x86_64 libstdc++-4.4.7-18.el6.x86_64 nss-softokn-freebl-3.14.3-23.el6_7.x86_64
4. Set breakpoint 4.1.View the function Sql_cmd_insert::mysql_insertbool Sql_cmd_insert::mysql_insert (THD * thd,TABLE_LIST * table_list) {DBUG_ENTER ("mysql_insert") of line 423 of the source code sql_insert.cc of the insert statement.
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
Set the breakpoint of insert (gdb) b Sql_cmd_insert::mysql_insert Breakpoint 1 at 0x17bd1b9: file / root/mysql-server/sql/sql_insert.cc, line 423 in gdb in session1.
4.3.Look at the breakpoint information and use multiple MySQL functions from the bottom up. (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::connection_event_loop (this=0x45b5ec0) at / root/mysql-server/sql/conn_handler/connection_acceptor.h:66 # 3 0x0000000000ec6226 in mysqld_main (argc=17 Argv=0x3ab4248) at / root/mysql-server/sql/mysqld.cc:5045 # 4 0x0000000000ebd2d4 in main (argc=9, argv=0x7fffb2aa7408) at / root/mysql-server/sql/main.cc:25
4.4.After setting the breakpoint, log in to the database in another session2 and find that you cannot log in. When hung resides, execute next in gdb (execute the next code), you can see that line 859 of the socket_connection.cc source code cannot continue. The code roughly means that you want to get the socket of the system, as well as some monitoring information. Because there is too much, execute continue (to the next executable code) in gdb directly, and session2 has logged in successfully. (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. when session2 does the insert operation, once again hung stops, session1 prints out the breakpoint information, in the mysql_insert:423 line, the data can not be inserted normally until continue,session2 is executed. (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.
Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.
Views: 0
*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.
Continue with the installation of the previous hadoop.First, install zookooper1. Decompress zookoope
"Every 5-10 years, there's a rare product, a really special, very unusual product that's the most un
© 2024 shulou.com SLNews company. All rights reserved.